如何在SQL Server中声明全局变量..?

时间:2014-03-13 07:55:31

标签: sql sql-server

我想对来自不同数据库的不同查询使用相同的值

DECLARE @GLOBAL_VAR_1 INT = Value_1

DECLARE @GLOBAL_VAR_2 INT = Value_2

USE "DB_1"
GO
SELECT * FROM "TABLE" WHERE "COL_!" = @GLOBAL_VAR_1 

AND "COL_2" = @GLOBAL_VAR_2

USE "DB_2"
GO

SELECT * FROM "TABLE" WHERE "COL_!" = @GLOBAL_VAR_2 

但是给出错误。

  

必须声明标量变量" @ GLOBAL_VAR_2"。

任何人都可以提出任何方法吗?

10 个答案:

答案 0 :(得分:30)

无法在Transact-SQL中声明全局变量。但是,如果您希望所有变量都可以在单个脚本的批次中访问,则可以使用 SQLCMD 工具或SSMS的 SQLCMD模式并定义该工具/ mode特定的变量如下:

:setvar myvar 10

然后像这样使用它们:

$(myvar)

使用SSMS的SQLCMD模式:

enter image description here

答案 1 :(得分:12)

不能在SQLServer中声明全局变量。

如果你正在使用Management Studio,你可以像@Lanorkin指出的那样使用SQLCMD模式。

否则,您可以使用CONTEXT_INFO来存储在会话和连接期间可见的单个变量,但之后它会消失。

只有真正全局的才能创建一个全局临时表(名为## yourTableName),并将变量存储在那里,但是当所有连接都关闭时,它也会消失。

答案 2 :(得分:7)

您可以尝试全局表格:

create table ##global_var
            (var1 int
            ,var2 int)

USE "DB_1"
GO
SELECT * FROM "TABLE" WHERE "COL_!" = (select var1 from ##global_var) 

AND "COL_2" = @GLOBAL_VAR_2

USE "DB_2"
GO

SELECT * FROM "TABLE" WHERE "COL_!" = (select var2 from ##global_var) 

答案 3 :(得分:3)

SQL Server 2016开始,通过SESSION_CONTEXTsp_set_session_context引入了一种在会话中共享信息的新方式。

您可以将它们用作CONTEXT_INFO()的替代,它仅保留限制为128字节的二进制值。此外,用户可以随时重写该值,并且使用它进行安全检查并不是很好。

使用新的utils解决了以下问题。您可以以更加用户友好的格式存储数据:

EXEC sp_set_session_context 'language', 'English';  
SELECT SESSION_CONTEXT(N'language');

另外,我们可以将其标记为read-only

EXEC sp_set_session_context 'user_id', 4, @read_only = 1;  

如果您尝试修改read-only会话上下文,您将得到以下内容:

  

Msg 15664,Level 16,State 1,Procedure sp_set_session_context,Line   10无法在会话上下文中设置键'user_id'。密钥已设置为   read_only for this session。

答案 4 :(得分:2)

在该特定示例中,由于使用语句之后的GO而导致错误。 GO语句重置环境,因此不存在用户变量。他们必须再次宣布。 并且全局变量问题的答案是否,不存在全局变量,至少Sql server版本等于或早于2008年。对于较新的sql server版本,我无法保证相同。

此致 HINI

答案 5 :(得分:2)

尝试使用;代替GO。它适用于我的2008 R2版本

DECLARE @GLOBAL_VAR_1 INT = Value_1;

DECLARE @GLOBAL_VAR_2 INT = Value_2;

USE "DB_1";
SELECT * FROM "TABLE" WHERE "COL_!" = @GLOBAL_VAR_1 

AND "COL_2" = @GLOBAL_VAR_2;

USE "DB_2";

SELECT * FROM "TABLE" WHERE "COL_!" = @GLOBAL_VAR_2;

答案 6 :(得分:0)

无法在SQL Server中声明全局变量。 Sql server有一个全局变量的概念,但它们是系统定义的,不能扩展。

显然你可以用你发送的SQL做各种技巧 - 例如SqlCOmmand有这样一个变量替换机制 - 在你把它发送到SqlServer之前,但就是这样。

答案 7 :(得分:0)

我喜欢为每个全局变量使用带有列的表的方法。这样,您将获得自动完成功能,以帮助对变量的检索进行编码。可以将表限制为一行,如下所示:SQL Server: how to constrain a table to contain a single row?

答案 8 :(得分:-2)

declare @ID_var int
set @ID_var = 123456

select * from table where ID_var = @ID_var

declare @ID_var varchar(30)
set @ID_var = 123456

select * from table where ID_var = @ID_var

答案 9 :(得分:-3)

我的第一个问题是您使用的是哪个版本的SQL Server(即2005,2008,2008 R2,2012)?

假设您使用的是2008或更高版本的SQL使用范围进行变量确定。我相信2005年仍然有全局变量,它们将使用@@ variablename而不是@variable name来定义全局和局部变量之间的差异。从2008年开始,我相信这已经改为范围定义的变量指定结构。例如,为了创建一个全局变量,必须在过程,函数,视图等的开头定义@variable。在2008及以后的@@定义系统函数的系统变量我相信。如果你解释了版本以及定义变量的位置,以及你得到的错误,我可以进一步解释。