【问题标题】:Converting a query to dynamic SQL with linked server variable使用链接服务器变量将查询转换为动态 SQL
【发布时间】:2017-01-19 13:32:13
【问题描述】:

我有一个需要转换的存储过程,以便它从表中读取链接服务器变量。据我所知,这样做的唯一方法是使用动态 SQL。问题是我无法转换我的查询。

原始查询:

SET @var1 = ''
SELECT  @var1 = RECEIVER        
FROM    databse1.dbo.table1 
WHERE   SAPNUMBER = @var2

转换后的查询:

SET @srv = (SELECT server_name
            FROM Configuration.dbo.Server_Switch)

SET @var1 = ''
exec (  
'SELECT ' + @var1 + '= RECEIVER
FROM ' + @srv + '.databse1.dbo.table1 
WHERE SAPNUMBER =' + @var2
)

我得到的错误是:

Incorrect syntax near '='

@var1 和@var2 是预先声明的变量。我很确定在动态 SQL 中为这些变量赋值时存在问题,因此出现“=”错误。我可以在转换此查询方面获得一些帮助吗?

【问题讨论】:

  • 为什么你认为动态sql可以解决任何问题呢?它唯一能做的就是增加问题的可能性。想象一下,如果有人在 Server_Switch 表中存储了一个 Bobby Tables ....

标签: sql-server variables server dynamic-sql


【解决方案1】:

解决它的一种方法是使用带有输出参数的 sp_executeSql:

SET @srv = (SELECT server_name
            FROM Configuration.dbo.Server_Switch)

DECLARE @sql nvarchar(500),
        @ParmDefinition nvarchar(500);

SET @sql = 
'SELECT @output = RECEIVER
FROM ' + @srv + '.databse1.dbo.table1 
WHERE SAPNUMBER =' + @var2

SET @ParmDefinition = N'@var1 varchar(100) OUTPUT';

EXEC sp_executesql @Sql, @ParmDefinition, @var1=@output OUTPUT;

【讨论】:

    【解决方案2】:

    请提供更多信息。我们需要变量@var2、@var1 声明、变量类型。如果@var2 是 varchar,请按以下方式更新您的查询:

    declare @sql nvarchar(4000) = 
    'SELECT ' + @var1 + '= RECEIVER
    FROM ' + @srv + '.databse1.dbo.table1 
    WHERE SAPNUMBER =' + char(39) + @var2 + char(39);
    
    exec(@sql); 
    

    附注如果@var2 数字:

    declare @sql nvarchar(4000) = 
    'SELECT ' + @var1 + '= RECEIVER
    FROM ' + @srv + '.databse1.dbo.table1 
    WHERE SAPNUMBER =' + @var2;
    exec(@sql); 
    

    【讨论】:

    • 最后我明白了,您的目标是在@var1 中获得价值,而不是获得记录集。在这种情况下,您需要使用带有输出的 sp_executesql,如 Zohar Peled 所说
    猜你喜欢
    • 1970-01-01
    • 2020-10-06
    • 2020-12-02
    • 2021-05-24
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多