代码之家  ›  专栏  ›  技术社区  ›  user61578

带列表参数的TSQL Openquery

  •  0
  • user61578  · 技术社区  · 2 年前

    我想知道如何将列表传递到 openquery 。要使用单个值,请执行以下操作:

    DECLARE @TSQL varchar(8000), @VAR char(2)
    
    SELECT @VAR = 'CA'
    SELECT @TSQL = 'SELECT * FROM OPENQUERY(MyLinkedServer,''SELECT * FROM pubs.dbo.authors WHERE state = ''''' + @VAR + ''''''')'
    
    EXEC (@TSQL)
    

    including parameters in OPENQUERY

    然而,我需要能够使用这样的条件

    WHERE state IN ('CA', 'TX', 'SD') 
    

    而不是 = 'CA' 。我尝试了很多事情,但都没有成功。感谢您的帮助。

    我尝试使用以下解决方案,但失败了。

    DECLARE @list NVARCHAR(MAX)
    SET @list = 'value1, value2, value3' -- Replace this with your list of values
    
    DECLARE @sql NVARCHAR(MAX)
    SET @sql = '
    SELECT * 
    FROM OPENQUERY([YourLinkedServerName], 
        ''SELECT * 
          FROM YourRemoteTable 
          WHERE YourColumn IN (''' + REPLACE(@list, ',', ''',''') + ''')''
        )'
    
    EXEC sp_executesql @sql
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Squirrel    2 年前

    如果你做了 PRINT @sql ,您将看到动态查询是

    SELECT * 
    FROM OPENQUERY([YourLinkedServerName], 
        'SELECT * 
          FROM YourRemoteTable 
          WHERE YourColumn IN ('value1',' value2',' value3')'
        )
    

    这是错误的。在动态查询中,您需要将单引号加倍

    SELECT * 
    FROM OPENQUERY([YourLinkedServerName], 
        'SELECT * 
          FROM YourRemoteTable 
          WHERE YourColumn IN (''value1'','' value2'','' value3'')'
        )
    

    所以当形成 @sql ,应该是

    IN (''''' + REPLACE(@list, ',', ''''',''''') + ''''')''