需要帮助来弄清楚为什么我在服务器上执行的远程查询返回 0 行,但相同的查询在目标数据库中返回超过 900k 行。
字符串长度少于 8000 个字符,所以我不会在这里发布。 但这基本上是结构:
declare @SQL varchar(MAX);
declare @D varchar(15);
declare @Per varchar(15);
declare @NextPer varchar(15);
declare @NextYPer varchar(15);
set @D = N'01-JUN-2019'
set @Per = N'2020004';
set @NextYPer = N'2021004'
set @NextPer = N'2020005'
set @SQL = N' SELECT ...... '
set @SQL = N'select * from openquery ([LK1], "'+@SQL+'")';
execute( @SQL);
print @SQL;
注意:链接服务器可以工作,并成功地用于其他字符串较短的开放查询。我尝试使用 EXECUTE (@SQL( AT 但仍然得到 0 行。 当我直接在 Oracle 数据库上执行打印输出时,查询运行大约 15 分钟并给出结果。
首先,OPENQUERY
要求第二个参数是查询字符串。SQL Server 中的字符串写在单引号之间。来自 OPENQUERY 文档:
OPENQUERY ( linked_server ,'query' )
不仅如此,出现在该字符串中的 SQL 需要将查询中显示的任何单引号加倍。假设您有要执行以下查询的 SQL:
SELECT * FROM some_table WHERE name='TT.';
你可以把它写成:
OPENQUERY(lks,'SELECT * FROM some_table WHERE name=''TT.''')
但是如果你在动态 SQL 语句中有这个,这将变成
DECLARE @s VARCHAR(MAX);
SET @s='SELECT * FROM OPENQUERY(lks,''SELECT * FROM some_table WHERE name=''''TT.'''''')';
因此,即使是更琐碎的SQL查询,这也是单引号的爆炸式增长。数你们的报价,确保查询本身符合鼻烟(即报价已适当加倍(。
谢谢大家的输入。
根本原因只是 Date 参数的格式,该参数在链接服务器上未正确运行。我所要做的就是更改我的查询以使用它:
SO_BOOK_DATE
而不是
SO_BOOK_DATE <"@D"。