为什么 openquery 在 SQL 服务器上返回 0 行,但在目标服务器中有 900k 行?

Why is the openquery returning 0 rows on SQL server but has 900k rows in the target Server?

需要帮助弄清楚为什么我在服务器上执行的远程查询 return 0 行,但相同的查询 return 在目标数据库中超过 900k 行。

该字符串的长度少于 8000 个字符,因此我不会在此处 post。但这基本上是结构:

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 DB 上执行打印输出时,查询运行大约 15 分钟并给出结果。

首先,OPENQUERY 要求第二个参数是查询字符串。 SQL 服务器中的字符串用单引号括起来。来自 OPENQUERY documentation:

OPENQUERY ( linked_server ,'query' ) 

不仅如此,出现在该字符串中的 SQL 需要将出现在查询中的任何 single-quotes 加倍。假设您 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 查询,单引号也会爆炸式增长。计算引号,确保查询本身符合要求(即引号已正确加倍)。

感谢大家的投入。

根本原因只是日期参数的格式,它在链接服务器上 运行 不正确。 我所要做的就是更改我的查询以使用此:

SO_BOOK_DATE < to_date(''@D'' , ''DD-MON-YYYY'')

而不是

SO_BOOK_DATE < ''@D'' .