GO的全局变量

时间:2011-03-23 19:39:32

标签: tsql

我正在尝试批量处理一些SQL脚本。在顶部,我已经宣布了一些我认为在术语

意义上的全局变量

所以:

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
...

声明超出范围...意味着当我运行它时,后续批处理脚本找不到那些声明。有没有办法让所有使用或设置这些变量的批处理脚本保持全局?

5 个答案:

答案 0 :(得分:21)

临时表确实存在go

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

获取价值:

select someVar1 from #vars

设定值

update #vars set someVar1 = 'def'

临时表特定于您的连接,因此它们不是全局的。

答案 1 :(得分:10)

您可以声明脚本变量,可以使用setvar命令明确定义,也不要超出GO语句的范围。

e.g。

--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

有关详情,请访问:http://technet.microsoft.com/en-us/library/ms188714.aspx

答案 2 :(得分:4)

没有全局变量,但你可以这样做:Link

用法示例:

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

使用上面链接中提到的存储过程,我能够设置全局变量并将它们放在GO之间。

答案 3 :(得分:4)

您可能不需要使用批次,在这种情况下,您可以让您的变量存活很长时间。我不确定这是否是最佳实践,但是例如函数声明通常必须是批处理中的唯一语句,如下所示:

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

但是你可以使用* sp_executesql *重写它,并避免所有这些批次:

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

这真的取决于你的脚本的复杂性,因为你是否想要这样做,因为它会变得有点混乱,一旦所有东西都在一个巨大的字符串中你就会失去语法高亮:)

答案 4 :(得分:2)

变量超出范围,因为GO statement表示批次结束。 Microsoft文档主题Transact-SQL Variables具有以下示例:

  

范围   变量从它的位置持续   声明直到批次结束或   它所在的存储过程   声明。例如,以下内容   脚本生成语法错误   因为变量是在声明的   一批并在另一批中引用:

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;

我认为你想要做的是创建一个临时表来存储你的“全局”变量。请参阅Andomar的答案,了解如何执行此操作的示例。他每排有一个变量。我还看到临时表,每个全局变量都有一列,只需将单行插入表中。这允许每个变量具有不同的数据类型。