我知道你不能在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'是表名变量)
我一直在寻找答案,但我找不到任何答案,我真的需要你的帮助。
答案 0 :(得分:0)
您可以暂时将EXECUTE更改为PRINT(PRINT @openQuery),查看实际生成的SQL,然后尝试直接在SSMS中运行生成的sql。当您看到生成的sql时可能会很明显,但如果没有,您可能会收到更具描述性的错误消息。