Contactos

Asignar un valor en la consulta de SQL. Conceptos básicos de la programación en T-SQL. Usando funciones para trabajar con variables de cadena

Quiero usar el mismo valor para diferentes solicitudes de diferentes bases de datos.

Declarar @ global_var_1 int \u003d value_1 declarar @ global_var_2 int \u003d value_2 Use "DB_1" IR SELECT * de "TABLE" donde "COL_!" \u003d @ Global_var_1 y "col_2" \u003d @ global_var_2 use "db_2" vaya Seleccionar * de "TABLE" donde "col_!" \u003d @ Global_var_2.

pero da un error.

Es necesario declarar la variable escalar "@ global_var_2".

¿Alguien puede ofrecer alguna forma de hacer esto ...?

11 respuestas

No se puede anunciar la variable global en Transact-SQL. Sin embargo, si todo lo que desea que sus variables estén disponibles para los paquetes de un script, puede usar la herramienta Sqlcmd. o Modo SQLCMD SSMS y defina esta herramienta / variables dependiendo del modo, por ejemplo:

: sedevar myvar 10

Y luego usándolos de la siguiente manera:

$ (Myvar)

Para utilizar el modo SSQ SQLCMD:

No puedes Declaración de variables globales en SQLSERVER.

Si está utilizando Administration Studio, puede usar el modo SQLCMD como se especifica @lanorkin.

De lo contrario, puede usar el contexto_info para almacenar una variable, que es visible durante una sesión y conexiones, pero luego desaparecerá.

Solo un verdadero global creará una tabla temporal global (con el nombre ## YourtableName) y ahorrará sus variables allí, pero también desaparecerá cuando todas las conexiones estén cerradas.

Puedes probar la tabla global:

Crear tabla ## global_var (var1 int, var2 int) Use "DB_1" GO Seleccione * de "Tabla" donde "COL_!" \u003d (Seleccione VAR1 desde ## global_var) y "col_2" \u003d @ global_var_2 use "db_2" go sel Select * de "Tabla" donde "COL_!" \u003d (Seleccione VAR2 de ## global_var)

En este ejemplo particular, se relaciona un error para ir después de los operadores de uso. Los operadores de IR reinicien el entorno, por lo que no hay variables de usuario. Deben ser anunciados de nuevo. Y la respuesta a la pregunta de las variables globales no es, no hay variables globales, al menos una versión de SQL Server, igual o hasta 2008. No puedo garantizar lo mismo para las versiones más nuevas del SQL Server.

Sinceramente, Hini

Comenzando con SQL Server 2016, se representa una nueva forma de intercambiar información en una sesión a través de Session_context y sp_set_session_context.

Puede usarlos como una alternativa a contexto_info (), en los que solo se almacena el valor binario, limitado a 128 bytes. Además, el usuario puede reescribir el valor en cualquier momento, y no es muy bueno usarlo para verificar.

Los siguientes problemas se resuelven utilizando nuevas utilidades. Puede almacenar datos en un formato más fácil de usar:

EXEC SP_SET_SESION_CONTEXT "IDIOMA", "INGLÉS"; Seleccione Session_Context (n "idioma");

Además, podemos marcarlo como solo de lectura:

EXEC SP_SET_SESION_CONTEXT "user_id", 4, @read_only \u003d 1;

Si intenta cambiar el contexto de la sesión de solo lectura, obtendrá algo como esto:

Mensaje 15664, Nivel 16, Estado 1, Procedimiento SP_SET_SESSION_CONTONT, LINE 10 No se puede instalar la tecla "User_ID" en el contexto de la sesión. La clave se estableció tan pronto como para esta sesión.

Tratar de usar; en lugar de ir Funcionó para mí para la versión 2008 R2.

Declarar @ global_var_1 int \u003d value_1; Declarar @ global_var_2 int \u003d value_2; Usar "db_1"; Seleccione * De "Tabla" donde "col_!" \u003d @ Global_var_1 y "col_2" \u003d @ global_var_2; Usar "db_2"; Seleccione * De "Tabla" donde "col_!" \u003d @ Global_var_2;

Se puede obtener un resultado similar creando funciones escalares que devuelven los valores de las variables. Por supuesto, las llamadas de llamadas pueden ser costosas si las usa en consultas que devuelven un gran número de resultados, pero si lima el conjunto de resultados, todo debe estar en orden. Aquí uso una base de datos creada solo para almacenar estos valores de media pista, pero también puede crearlos para cada base de datos. Como puede ver, no hay variables de entrada aquí, solo una función con un nombre bien nombrado que devuelve el valor estático: si cambia este valor a la función, cambia instantáneamente donde se usa (siguiente desafío). \u003e

Use IR Crear función dbo.global_getstandardfonts () devuelve a Nvarchar (255), ya que comience la devolución "Forma-familia:" Calibri Light "," Sans-Serif ";" FIN GO - Uso: Seleccione " ... "- Resultado: ...

Establecer los valores de las variables.

Actualmente, hay dos formas de establecer el valor del valor de la variable en SQL, para este propósito, puede usar la instrucción SELECT o SET. Desde el punto de vista de las funciones realizadas, estos operadores actúan casi lo mismo, sin contar que la instrucción SELECT permite el valor de la asignación original de la tabla especificada en la instrucción SELECT.

La instrucción SET generalmente se usa para establecer los valores de las variables en este formulario, que a menudo se encuentra en los idiomas de procedimiento. Como ejemplos típicos de aplicar este operador, puede especificar lo siguiente:

Set @b \u003d @a * 1.5

Tenga en cuenta que todos estos operadores se implementan directamente por las operaciones de asignación en las que se usan valores explícitamente específicos u otras variables. Usando la instrucción SET, es imposible asignar un valor variable obtenido usando la consulta; La consulta debe ejecutarse por separado y solo después de que el resultado obtenido se puede asignar utilizando la instrucción SET. Por ejemplo, un intento de realizar dicho operador causa un error:

Establecer @c \u003d contar (*) de la ciudad

y el siguiente operador es totalmente exitoso:

Establecer @c \u003d (seleccione CUENTA (*) de la ciudad)

La instrucción SELECT se usa generalmente para asignar valores por variables si la fuente de información que debe guardarse en una variable es una consulta. Por ejemplo, las acciones implementadas en el Código anterior se implementan mucho más a menudo utilizando la declaración SELECT:

Seleccione @c \u003d cuenta (*) de la ciudad

Tenga en cuenta que este código es ligeramente más claro (en particular, es más lacónico, aunque realizando las mismas acciones).

Por lo tanto, es posible formular el siguiente acuerdo generalmente aceptado sobre el uso del otro operador.

La instrucción SET se usa si se debe realizar una operación de asignación simple, es decir, Si el valor asignado ya está especificado explícitamente en forma de cierto valor o en forma de alguna otra variable.

La instrucción SELECT se aplica si la asignación del valor de la variable debe basarse en la solicitud.

Usando variables en consultas SQL

Una de las propiedades útiles del lenguaje T-SQL es que las variables se pueden usar en consultas sin la necesidad de crear líneas dinámicas complejas que incorporen variables en el código del programa. SQL dinámico continúa su existencia, pero se puede cambiar un solo valor, utilizando una variable.

Dondequiera que se pueda usar una expresión en la consulta, se puede usar una variable. El siguiente ejemplo demuestra el uso de una variable en la oración donde la oración:

Declarar @idprod int;

Establecer @idprod \u003d 1;

SELECCIONE

La variable local de Transact-SQL es un objeto que contiene un cierto valor de un tipo específico. Las variables se usan generalmente en paquetes y scripts:

    como un contador de ciclo;

    para almacenar el valor que desea verificar la instrucción de control de flujo;

    para almacenar el valor devuelto por la función o el procedimiento almacenado.

El siguiente script crea una pequeña tabla de pruebas de 26 líneas. La variable se usa en un script como:

    medidor de ciclo para controlar el número de líneas insertadas;

    los valores insertados en la columna tipo entero;

    el argumento de la función formando una cadena que se inserta en la columna Tipo de caracteres:

Crea la tabla. Crear la mesa de prueba de la tabla (cola int, colb char (3)); Ve a nocount on; Ir: declare la variable a utilizar. Declarar @mycounter int; - Inicializar la variable. Establecer @mycounter \u003d 0; - Pruebe la variable para ver si el bucle se termina. While (@mycounter.< 26) BEGIN; -- Insert a row into the table. INSERT INTO TestTable VALUES -- Use the variable to provide the integer value -- for cola. Also use it to generate a unique letter -- for each row. Use the ASCII function to get the -- integer value of "a". Add @MyCounter. Use CHAR to -- convert the sum back to the character @MyCounter -- characters after "a". (@MyCounter, CHAR((@MyCounter + ASCII("a")))); -- Increment the variable to count this iteration -- of the loop. SET @MyCounter = @MyCounter + 1; END; GO SET NOCOUNT OFF; GO -- View the data. SELECT cola, colb FROM TestTable; GO DROP TABLE TestTable; GO

Anuncio de variables en Transact-SQL

La instrucción Declare inicializa la variable TRANSACT-SQL de la siguiente manera:

    Asignación de nombre. El primer carácter del nombre debe ser un solo símbolo.

    Propósito de la longitud y el tipo de datos definidos por el sistema o usuario. Para las variables numéricas, la precisión y la escala también se establecen. Para las variables del tipo XML, una colección de circuitos puede ser opcionalmente.

    Asigna valor nulo creado por variable.

Por ejemplo, la siguiente declaración Declare crea una variable local @Mycounter del tipo de datos INT.

Declarar @mycounter int;

La instrucción Declare le permite declarar varias variables locales de los mismos o diferentes tipos de coma.

Por ejemplo, la siguiente declaración Declare crea tres variables locales, @LastName, @firstname y @StateProvinde, y le asigna a cada uno de ellos un valor de NULL:

Declarar @lastname nvarchar (30), @firstname nvarchar (20), @stateprovince nchar (2);

El área variable se denomina rango de instrucciones Transact-SQL que se puede manejar. El área variable es todas las instrucciones entre su declaración y el final del paquete o el procedimiento almacenado, donde se declara. Por ejemplo, el siguiente script contiene un error de sintaxis, ya que la variable se declara en un paquete y se usa en otra:

Use AdventureWorks2008R2; GO declarar @myvariable int; Establecer @myvariable \u003d 1; - Termine el lote usando la palabra clave GO. Go - @myVariable ha salido de alcance y ya no existe. - Este estado seleccionado merece un error de sintaxis porque es, ya no es legal hacer referencia a @myVariable. Seleccione BusinessentyID, NationalIDNumber, Jobtitle de HumanResours.Eployeee, donde BusinesentyID \u003d @myvariable;

Las variables tienen un área local y están disponibles solo dentro del paquete o procedimiento donde se declaran. En el siguiente ejemplo, un área incorporada creada para realizar el procedimiento SP_EXECUSTUSQL no tiene acceso a una variable declarada en un alcance superior, y devuelve un error:

Declarar @myvariable int; Establecer @myvariable \u003d 1; Ejecutar SP_EXECUSTUSQL N "SELECT @MyVariable"; - Esto produce un error.

Asignación del valor de la variable en Transact-SQL

Al declarar la variable asigna el valor de NULL. Para cambiar el valor de la variable, se aplica la instrucción SET. Este método de asignación de valores variables es preferida. Además, la variable se le puede asignar un valor especificándolo en la lista Seleccionar selección de instrucciones.

Para asignar el valor de la variable utilizando la instrucción SET, debe especificar su nombre y su valor asignado. Este método de asignación de valores variables es preferida. Por ejemplo, el siguiente paquete anuncia dos variables, asigna valores a ellos y los usa en la instrucción de selección donde

Use AdventureWorks2008R2; Ir: declara dos variables. Declarar @firstnamevariable nvarchar (50), @postalcodevariable nvarchar (15); - Establece sus valores. Establecer @firstnamevariable \u003d n "amy"; Establecer @postalcoderevariable \u003d n "ba5 3hx"; - Utilícelos en la causa de una declaración de selección. Seleccione Apellido, Nombre, Nombre, Jobtitle, City, StateProvincename, CountryRegionName de HumanResources.Vemployee donde FirstName \u003d @FirstNameVariable o Postalcode \u003d @postalcodevariable; Ir.

Se le puede asignar una variable un valor especificándolo en la lista de selección. Si la lista de selección se refiere a la variable, debe asignarse un valor escalar, o la instrucción SELECT debe devolver una sola línea. Por ejemplo:

Use AdventureWorks2008R2; GO Declare @empidVariable int; Seleccione @empidVariable \u003d MAX (EmployeSeID) de HumanResources.Meploye; Ir.

Si la instrucción SELECT devuelve más de una línea, y la variable se refiere a una expresión no denuosa, se le asigna un valor que se devuelve a Express en la última fila del conjunto resultante. Por ejemplo, en el siguiente paquete de variables, se le asigna el valor @empidVariable el valor del Identificador de EyotherentityID de la última cadena devuelta igual a 1:

Use AdventureWorks2008R2; GO Declare @empidVariable int; Seleccione @empidVariable \u003d BusinessentityID de HumanResources.EmployEE solicitado por ONTSNEXENTITYID DESC; Seleccione @empidVariable; Ir.

Última actualización: 08/14/2017

A través de las variables, podemos transferir datos a las solicitudes. Y también podemos recibir datos que son el resultado de solicitudes, variables. Por ejemplo, cuando se muestre de tablas utilizando el comando SELECT, podemos recuperar datos a una variable utilizando la siguiente sintaxis:

Seleccione @ variable_1 \u003d especification_libes_1, @ variable_2 \u003d especification_stolbet_2, ...................................... @ variable_n \u003d especification_stolbet_n.

Además, en el conjunto de expresión, el valor asignado a la variable también puede ser el resultado del comando SELECT.

Por ejemplo, seamos las siguientes tablas:

Crear productos de tabla (ID Int intentity Tecla principal, Nombre del producto NVARCHAR (30) NO NULL, FABRICANTE NVARCHAR (20) NO NULLO NO NULL, PRODUCTO DE PRODUCTOS INTALERADOS 0, DINERO DE PRECIO NO NULL); CREAR CLIENTES DE TABLA (CLAVE PRIMARIO DE LA INTERIOR DE ID INT, NAME NAME NVARCHAR (30) NO NULL); Cree órdenes de la tabla (ID Int intentity Tecla principal, PRODUCTUS PRODUCTUS INT NO NULLES PRODUCTOS (ID) ON DELETE CASCADE, CustomerID INT NO NULL REFERENCIAS CLIENTES (ID) en Eliminar Cascade, Fecha creada No NULL, PRODUCTO INTE Predeterminado 1, Precio El dinero no nulo )

Use variables al eliminar los datos:

Declarar @maxprice money, @minprice money, @dif money, @count int set @count \u003d (Seleccionar suma (Cumplimiento) de los pedidos); Seleccione @ minprice \u003d min (precio), @maxprice \u003d max (Precio) de los productos set @dif \u003d @maxprice - @minprice; Imprimir "Total vendido:" + STR (@count, 5) + "Producto (s)"; Imprimir "La diferencia entre el precio máximo y mínimo:" + STR (@dif)

En este caso, la variable @Count contendrá la cantidad de todos los valores de la columna de la Cuenta de Tabla de pedidos, es decir, el número total de bienes vendidos.

Las variables @min y @max se almacenan, respectivamente, los valores de columna mínima y máxima del precio de la tabla de productos, y la variable @dif es la diferencia entre estos valores. Y como valores simples, las variables también pueden participar en las operaciones.

Otro ejemplo:

Declare @Sum Money, @Id int, @prodid int, @Name Nvarchar (20); Establecer @ id \u003d 2; Seleccione @Sum \u003d Suma (Orders.Price * Pedidos. PRODUCTCOUNT), @ NOMBRE \u003d Products.ProductName, @PRODID \u003d Products.ID De los productos internos de unión en ProductID \u003d Products.ID Grupo por productos.productName, Products.ID tener [Correo electrónico protegido] Imprimir "Producto" + @Name + "Se vende por la cantidad" + STR (@Sum)

Aquí, los datos recuperables de los productos y pedidos de las dos tablas se agrupan con las columnas de ID y nombre de producto de la tabla de productos. Luego, los datos se filtran a través de la columna ID de productos. Y los datos extraídos caen en variables @sum, @name, @prodid.

Probablemente una de las primeras preguntas que surgen de programadores novatos en T-SQL, esta es una pregunta "¿Y cómo obtener una muestra de la tabla cuyo nombre aparece en la variable?"
Porque En T-SQL, no hay posibilidad de usar en algunas partes del valor de los valores variables, la única solución disponible es usar una solicitud dinámica. La idea es muy simple: en una variable especialmente definida "Recoger" la cadena de consulta que se debe realizar. A continuación, esta cadena comienza a ejecutarse. Correr se puede implementar de dos maneras.
- Usando el comando Ejecutar
- Usando el procedimiento del sistema SP_EXECUSTUSQL.

Se ve aproximadamente tan

Declarar @sql varchar ( 8000 ), @Table_name varchar ( 10 ) Establecer @sql \u003d "select * from" + @table_name ejecut (@sql) - y exec sp_executesql @sql Por lo general, las solicitudes dinámicas se forman dentro de los procedimientos almacenados en los que el parámetro de entrada se compila una cadena de ejecución específica.

I. FUENTE DE PEDIDO DINÁMICO
1. La consulta dinámica siempre se ejecuta en el mismo conector y como un paquete separado (lote). En otras palabras, al usar tal solicitud,
- No tiene acceso a las variables locales, anunció antes de la llamada de solicitud dinámica (sin embargo, es posible acceder a las tablas temporales previamente establecidas)
- Las tablas de hora locales y las variables creadas durante la ejecución del comando EXEC no estarán disponibles en el procedimiento de llamada, porque Se eliminará al final del paquete en el que se realiza EXEC.

2. La solicitud dinámica siempre se ejecuta con los derechos del usuario que causó el procedimiento, y no con los derechos del propietario del procedimiento. En otras palabras, si el Procedimiento Propio de Procedimiento es User1, que tiene el derecho de Tabla 1 Tabla 1, luego para el usuario de User2 un poco para asignar los derechos para ejecutar el procedimiento de procedimiento1, si la apelación a TABLA1 pasa por una consulta dinámica. Tendremos que darle derechos apropiados y directamente para TABLA1.

3. La finalización de la solicitud se produce inmediatamente antes de su llamada. Esos. Solo aprenderás sobre todos los errores sintácticos en este momento.

II. OPCIONES DE USO EQUIPO EXEC
1. El comando EXEC admite filas y / o variables al argumento como un argumento. Pero no apoyó la concatenación de los resultados de las funciones, es decir, Diseños de tipo
eXEC ("Seleccionar * de" + Izquierda (@tableName, 10 )) Prohibido utilizar.
2. El comando no tiene parámetros de entrada / salida.

III. PROCEDIMIENTO SP_EXECUTESQU
1. El procedimiento no admite el confirmación y / o las variables como parámetros.
2. El texto de la consulta debe ser de tipo variable NVARCHAR / NVAR / NVAR, o el mismo tipo de constante de cadena.
3. Es posible transferir parámetros al script ejecutable y obtener valores de salida.
Este último está claramente no descrito en la documentación, así que aquí hay algunos ejemplos.

En este ejemplo, 4 variables se transmiten en una solicitud dinámica, tres de los cuales son fines de semana.

declarar @ var1 int, @ var2 varchar ( 100 ), @ Var3 varchar ( 100 ), @ var4 int declarar @mysql nvarchar ( 4000 ) establecer @mysql \u003d "Set @ var1 \u003d @ var1 + @ var4; set @ var2 \u003d""CCCC" "; SET @ VAR3 \u003d @ VAR3 +" "DDDD" "" Set @ var1 \u003d 0 SET @ VAR2 \u003d "BBBB" SET @ VAR3 \u003d "AAAA" SET @ var4 \u003d 10 Seleccione @ var1, @ var2, @ var3 exec sp_executesql @mysql, n "@ Var1 int out, @ var2 varchar (100) out, @ var3 varchar (100) out, @ var4 int", @ var1 \u003d @ var1 out, @ var2 \u003d @ var2 out, @ var3 \u003d @ var3 out, @ var4 \u003d @ var4 select @ var1, @ var2, @ var3

En este ejemplo, el cursor se abre en una consulta dinámica, que está disponible en el procedimiento de llamada a través de la variable de salida

Uso Pubs declarar @cur cursor ejecut sp_executesql n "Set @ curvar \u003d cursor local para seleccionar Top 10 AU_ID, AU_LNAME, AU_FNAME DE AUTORES ABRIR @CURVAR" , N "@CURVAR SALIDA CURSOR", @ [Correo electrónico protegido] Salida Fetch Siguiente de @cur while while @@ fetch_status \u003d 0 Comience a buscar a Siguiente de @cur End

Resumen (más imho que los requisitos obligatorios)
La solicitud dinámica es muy útil y, a veces, solo una cosa indispensable, pero los métodos para su implementación y específicamente a través de una llamada en un paquete separado con los derechos del usuario que causaron el procedimiento, detenga su masa práctica.



¿Te gustó el artículo? Compártelo