我想对来自不同数据库的不同查询使用相同的值
像
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"。
任何人都可以提出任何方法吗?
答案 0 :(得分:30)
无法在Transact-SQL中声明全局变量。但是,如果您希望所有变量都可以在单个脚本的批次中访问,则可以使用 SQLCMD 工具或SSMS的 SQLCMD模式并定义该工具/ mode特定的变量如下:
:setvar myvar 10
然后像这样使用它们:
$(myvar)
使用SSMS的SQLCMD模式:
答案 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_CONTEXT和sp_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及以后的@@定义系统函数的系统变量我相信。如果你解释了版本以及定义变量的位置,以及你得到的错误,我可以进一步解释。