【发布时间】:2018-09-12 21:33:46
【问题描述】:
我正在尝试为链接服务器创建存储过程,其中输入参数@ServerName 是我使用的链接服务器的名称。 在这个过程中,我还声明了我想从动态 SQL 查询和行中获取哪个值的参数。
CREATE PROC sp_Version @ServerName varchar(30)
作为
声明 @Ver varchar(10)
exec ('select @Ver from openquery(' + @ServerName + ', ''SELECT SUBSTRING (@@VERSION, 22, 7) = @Ver''')
当我执行我的 sp 时,我收到一条错误消息:
“必须声明标量变量“@Ver”。”
你能帮帮我吗?
【问题讨论】:
-
对于用户存储过程,使用
sp_不是一个好习惯,您正在为此服务器声明@ver,过程期望在链接服务器中看到变量 -
“程序期望在链接服务器中看到变量”你的意思是“声明@Ver varchar(10)”我为我的本地服务器声明了变量,但不是链接服务器或类似的东西那个?
-
您的变量
@Ver在动态 SQL 中无法访问,因为它是作为单独的范围(使用 EXEC)执行的。您应该使用过程 sp_executesql 并将@ver值作为输出参数输出。 -
不要使用
sp_作为存储过程的前缀,尤其是不要使用像sp_version那样具有潜在冲突价值的名称。 See also。此外,SUBSTRING方法存在缺陷——在我的服务器上我得到了2017 (R,这可能不是您想要的。看看SERVERPROPERTY('ProductVersion')之类的东西。正如其他人所提到的,你不能像这样远程变量——看看INSERT .. EXEC。
标签: sql sql-server tsql stored-procedures linked-server