SQL Server 具有DATETIME条件的动态OPENQUERY

qmelpv7a  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(173)

有人能给我解释一下下面的表达式有什么问题吗?我相信我用CONVERT 126正确地转换了我的日期,我的引号用char 39正确地转义了,但是我可能错了。
T-SQL:

DECLARE @end2 DATETIME2 = GETDATE();

DECLARE @test2 nvarchar(200) = N'SELECT * FROM OPENQUERY(x, ' 
  + char(39) + 'SELECT OBJID FROM SALE WHERE MODIFIED >= ' 
  + CHAR(39) + CONVERT(nvarchar(24),@end2,126) 
  + char(39) + char(39) + ')';

PRINT @test2;

EXEC (@test2);

打印输出:

select * from openquery(x, 'SELECT OBJID FROM SALE 
WHERE MODIFIED >= '2023-01-19T11:55:21.1233'')

错误:
消息102,级别15,状态1
"2023"附近的语法不正确。
尝试了不同的格式,铸造等,我不能使用EXEC x..sys.sp_executesql,因为x是火鸟,而不是另一个SQL Server。

0qx6xfy6

0qx6xfy61#

你可以用另一个字符来转义',比如'',但是你需要双转义,也就是说你的最终字符串需要有双单引号才能在你的动态SQL中转义,这就意味着要进行大量的转义,比如

DECLARE @end2 DATETIME2
set @end2 = getdate()
declare @test2 nvarchar(200)
set @test2 = 'select * from openquery(x, ''SELECT OBJID FROM SALE WHERE MODIFIED >= '''''+convert(nvarchar(24),@end2,126)+''''''')'
print @test2
exec (@test2)

结果是:

select * 
from openquery(x, 'SELECT OBJID FROM SALE WHERE MODIFIED >= ''2023-01-19T18:06:22.6033''')

相关问题