为什么 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'' .
需要帮助弄清楚为什么我在服务器上执行的远程查询 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'' .