variable tipos the must globales from declarar tsql

tsql - tipos - variables globales en sql server



Variables globales con GO (5)

Es posible que no necesite usar lotes, en cuyo caso puede hacer que sus variables sobrevivan por mucho tiempo. No estoy seguro de si esta es la mejor práctica, pero por ejemplo, una declaración de función por lo general tendría que ser la única declaración en un lote así:

Declare @batch_scope_var INT GO --This is required CREATE FUNCTION dbo.Half(@function_scope_var int) RETURNS int WITH EXECUTE AS CALLER AS BEGIN RETURN @function_scope_var/2 END GO --This is required SET @batch_scope_var = 4 --Bugger, this is now out of scope and won''t execute! print dbo.Half(@batch_scope_var) GO

Sin embargo , puede volver a escribir esto utilizando * sp_executesql * y evitar todos esos lotes como estos:

Declare @batch_scope_var INT execute dbo.sp_executesql @statement = N'' CREATE FUNCTION dbo.Half(@function_scope_var int) RETURNS int WITH EXECUTE AS CALLER AS BEGIN RETURN @function_scope_var/2 END '' SET @batch_scope_var = 4 print dbo.Half(@batch_scope_var) GO

Realmente depende de la complejidad de su secuencia de comandos en cuanto a si desea hacer esto, ya que se puede ensuciar un poco y perder la sintaxis que resalta tan pronto como todo está en una cadena gigante :)

Estoy tratando de poner por lotes algunos scripts SQL. En la parte superior he declarado algunas variables que considero globales en el sentido del término

Asi que:

DECLARE @someVar1 DECLARE @someVar2 ...etc. GO Some batch of SQL here that sets @someVar1 and @SomeVar2 to a value and uses it in the SQL statement GO Some batch of SQL here that sets @someVar1 and @SomeVar2 to a value and uses it in the SQL statement GO ...

las declaraciones están fuera de alcance ... lo que significa que cuando ejecuto esto, los scripts de lotes posteriores no encuentran esas declaraciones. ¿Hay alguna manera de mantenerlos globales para todos los scripts de proceso por lotes que están utilizando o configurando estas variables para su uso?


Las tablas temporales sí sobreviven, go :

create table #vars (someVar1 varchar(10), someVar2 int) insert #vars values (''abc'',123)

Obtener valor:

select someVar1 from #vars

Valor ajustado

update #vars set someVar1 = ''def''

Las tablas temporales son específicas de su conexión, por lo que no son más globales de lo que tienen que ser.


Las variables están fuera de alcance porque la instrucción GO señala el final del lote. El tema de documentación de Microsoft msdn.microsoft.com/en-us/library/ms187953.aspx tiene este ejemplo:

El alcance de una variable dura desde el punto en que se declara hasta el final del lote o procedimiento almacenado en el que se declara. Por ejemplo, la siguiente secuencia de comandos genera un error de sintaxis porque la variable se declara en un lote y se hace referencia en otro:

USE AdventureWorks2008R2; GO DECLARE @MyVariable int; SET @MyVariable = 1; -- Terminate the batch by using the GO keyword. GO -- @MyVariable has gone out of scope and no longer exists. -- This SELECT statement generates a syntax error because it is -- no longer legal to reference @MyVariable. SELECT BusinessEntityID, NationalIDNumber, JobTitle FROM HumanResources.Employee WHERE BusinessEntityID = @MyVariable;

Creo que lo que quieres hacer es crear una tabla temporal para almacenar tus variables "globales". Vea la respuesta de Andomar para un ejemplo de cómo hacer eso. Tiene una variable por fila. También he visto tablas temporales que tienen una columna para cada variable global deseada y solo una fila se inserta en la tabla. Esto permite que cada variable tenga un tipo de datos diferente.


No existe tal cosa como una variable global, pero podrías hacer algo como esto: Link

Ejemplo de uso:

EXEC sp_SetGlobalVariableValue ''Test1'', ''test1'' EXEC sp_SetGlobalVariableValue ''Test2'', ''test2'' GO EXEC sp_GetGlobalVariableValue ''Test1'' EXEC sp_GetGlobalVariableValue ''Test2'' GO EXEC sp_GetGlobalVariableValue ''Test1'' EXEC sp_GetGlobalVariableValue ''Test2'' GO

Usando los procedimientos almacenados mencionados en el enlace anterior, pude establecer variables globales y hacer que duren entre las GO.


Puede declarar las variables de secuencia de comandos, que se pueden definir explícitamente mediante el comando setvar y no salir del ámbito en la instrucción GO.

p.ej

--Declare the variable :setvar MYDATABASE master --Use the variable USE $(MYDATABASE); SELECT * FROM [dbo].[refresh_indexes] GO --Use again after a GO SELECT * from $(MYDATABASE).[dbo].[refresh_indexes]; GO

Para obtener más información, visite: http://technet.microsoft.com/en-us/library/ms188714.aspx