OPENQUERY"延期准备中的变量无法完成"错误

时间:2014-07-15 10:25:13

标签: sql sql-server tsql dynamic-sql openquery

我知道你不能在OPENQUERY中包含变量,所以解决方法是动态SQL,我做了以下几点:

DECLARE @etd AS DATETIME = '2014-06-28'
DECLARE @source AS VARCHAR(46)
DECLARE @dbName AS VARCHAR(30)
DECLARE @query AS VARCHAR(MAX)
DECLARE @openQuery AS VARCHAR(MAX)

SELECT TOP(1) @source = [Source], @dbName = DbName
FROM dbo.SomeTable
WHERE SystemCode = 'SomeSystem'

SET @query = 'SELECT *
    FROM [' + @dbName + '].dbo.Table1 t1
    LEFT JOIN [' + @dbName + '].dbo.Table2 t2 ON t1.bookno = t2.tranno
    WHERE (YEAR(t1.etddate) = ' + CAST(YEAR(@etd) AS VARCHAR(4)) + 
    ' AND MONTH(t1.etddate) = ' + CAST(MONTH(@etd) AS VARCHAR(2)) + 
    ' AND DAY(t1.etddate) = ' + CAST(DAY(@etd) AS VARCHAR(2)) +')'

SET @openQuery = 'SELECT * FROM OPENQUERY([' + @source + '],''' + @query + ''')'

EXECUTE (@openQuery)

当我使用SELECT @openQuery时,我没有看到查询字符串有任何问题,但是一旦执行它,我收到以下错误:

  

链接服务器“xxx.xxx.xxx.xxx,1433”的OLE DB提供程序“SQLNCLI11”返回消息“延迟准备无法完成。”。
  Msg 8180,Level 16,State 1,Line 1
  声明无法准备   消息208,级别16,状态1,行1   无效的对象名称'xxxx.dbo.t1'。 (其中'xxxx'是表名变量)

我一直在寻找答案,但我找不到任何答案,我真的需要你的帮助。

1 个答案:

答案 0 :(得分:0)

您可以暂时将EXECUTE更改为PRINT(PRINT @openQuery),查看实际生成的SQL,然后尝试直接在SSMS中运行生成的sql。当您看到生成的sql时可能会很明显,但如果没有,您可能会收到更具描述性的错误消息。