【发布时间】: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