【问题标题】:Variables in OPENQUERY "Deferred prepare could not be completed" errorOPENQUERY 中的变量“无法完成延迟准备”错误
【发布时间】:2014-09-05 12:07:30
【问题描述】:

我了解您不能在 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”返回消息“延迟准备无法完成。”。
消息 8180,第 16 级,状态 1,第 1 行
无法准备报表。
消息 208,第 16 级,状态 1,第 1 行
无效的对象名称“xxxx.dbo.t1”。 (其中 'xxxx' 是表名变量)

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

【问题讨论】:

  • 源是链接服务器?您可以在 Management Studio 中执行 @query 中内置的查询吗?
  • 嗨 Martin K.,抱歉,您到底是什么意思?

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多