带参数的链接服务器的存储过程 - 错误

时间:2018-04-03 14:02:10

标签: sql sql-server tsql stored-procedures linked-server

我正在尝试为链接服务器创建存储过程,其中输入参数@ServerName是我使用的链接服务器的名称。 在这个过程中,我还声明参数,我想从动态SQL查询和行获取哪个值。

  

CREATE PROC sp_Version @ServerName varchar(30)
  作为
  声明@Ver varchar(10)
      exec('从openquery中选择@Ver(' + @ServerName +','' SELECT SUBSTRING(@@ VERSION,22,7)= @ Ver' '&#39)

当我执行我的sp时,我得到一个错误说:

  

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

你能帮我吗?

2 个答案:

答案 0 :(得分:1)

我不确定你的目标是@Ver的值,也许是OUTPUT参数?如果是这样,那么语法将是:

CREATE PROC GetVersion @ServerName varchar(30), @Ver nvarchar(500) OUTPUT AS

    DECLARE @SQL nvarchar(MAX);

    SET @SQL = N'SELECT @dVer = Version' + NCHAR(10) +
               N'FROM OPENROWSET(''SQLNCLI'',' + NCHAR(10) +
               N'                ' + QUOTENAME('Server=' + @ServerName + ';Trusted_Connection=YES;','''') + ',' +NCHAR(10) +
               N'                ''SELECT @@VERSION AS Version'');';

    PRINT @SQL;
    EXEC sp_executesql @SQL, N'@dVer nvarchar(500) OUTPUT', @dVer = @Ver OUTPUT;


GO

DECLARE @ver varchar(500)

EXEC GetVersion 'YourServerName', @ver OUTPUT;

PRINT @ver;
GO

DROP PROC GetVersion;

注意,首先,正如我所建议的那样,我没有使用sp_前缀。我还使用了sp_executesql而不是简单的EXEC(这通常是更好的做法,因为您可以像我一样参数化动态SQL),并QUOTENAME尝试并避免注射。

答案 1 :(得分:1)

我偶然遇到过这种情况。试试这个:

CREATE PROC sp_Version @ServerName varchar(30)
as
Declare @Ver varchar(10)

DECLARE @SqlCommand nvarchar(MAX)

SET @SqlCommand = 'SELECT @Ver2 = SUBSTRING (@@VERSION, 22, 7) '

DECLARE @sp_executesql VARCHAR(100)
SET @sp_executesql = @ServerName + '.master.sys.sp_executesql'
EXEC @sp_executesql @SqlCommand, N'@Ver2 nvarchar(10) out', @Ver out
SELECT @Ver