在SQL Server中对链接服务器进行动态查询

时间:2017-10-03 18:22:12

标签: sql-server tsql stored-procedures

我想在SQL Server中创建一个将在链接服务器上运行的动态查询。我试着这样做。

USE [MYDB]
GO

DECLARE @company AS nvarchar(50);
DECLARE @id nvarchar(MAX);
DECLARE @query nvarchar(MAX);

SET @company = 'mycompany.com';
SET @query = N'SELECT @csid = id FROM OPENQUERY(LINKSERVER12, 
   ''SELECT id from company where name = @comp'')';
EXECUTE sp_executesql @company_query, N'@comp nvarchar(50), @csid 
nvarchar(MAX) OUTPUT', @comp = @company,@csid = @id OUTPUT

在上面的脚本中,我想动态传递@comp的值。为此,我尝试在使用sp_executesql执行SQL时设置输入和输出变量。

我收到以下错误

  

SQL语句中的语法错误。在令牌处或之后的语法错误行1 [10179]。

     

Msg 7321,Level 16,State 2,Line 4
  准备查询时发生错误"来自公司的SELECT id,其中name = @comp"对OLE DB提供程序执行" MSDASQL"对于链接服务器" LINKSERVER12"。

错误发生在动态查询

N'SELECT @csid = id FROM OPENQUERY(LINKSERVER12, 
   ''SELECT id from company where name = @comp'')'

我尝试使用' @comp'@comp''替换SQL查询中的''''@comp'''',但没有运气。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

只需使用参数构建字符串查询。

USE [companyDB]
GO

DECLARE
    @companyName AS nvarchar(50)
    ,@id nvarchar(MAX)
    ,@query NVARCHAR(MAX)

SET @companyName = 'AMAZON'

DECLARE @idTable TABLE
(
    id INT
)

--Repace Server, UID and PWD
SET @query = 
N'SELECT 
    [id]
FROM OPENROWSET
(
    N''SQLNCLI''
    ,N''Server=10.111.1.111;UID=username;PWD=password123;''
    ,N''SELECT [id]
       FROM [companyDB]
       WHERE [name] = '''''+@companyName+'''''''
)'

INSERT INTO @idTable
EXECUTE (@query)

SELECT TOP 1
    @id = id
FROM @idTable