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