首页 文章

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

提问于
浏览
0

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

CREATE PROC sp_Version @ServerName varchar(30)as Declare @Ver varchar(10)exec('select @Ver from openquery('@ ServerName',''SELECT SUBSTRING(@@ VERSION,22,7)= @Ver'' “)

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

“必须声明标量变量”@Ver“ . ”

请你帮助我好吗?

2 回答

  • 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
    
  • 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 试图避免注入 .

相关问题