我正在尝试批量处理一些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
...
声明超出范围...意味着当我运行它时,后续批处理脚本找不到那些声明。有没有办法让所有使用或设置这些变量的批处理脚本保持全局?
答案 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的答案,了解如何执行此操作的示例。他每排有一个变量。我还看到临时表,每个全局变量都有一列,只需将单行插入表中。这允许每个变量具有不同的数据类型。