带DATETIME条件的动态OPENQUERY



谁能给我解释一下下面的表达式有什么问题?我相信我正在使用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'')
错误:

Msg 102, Level 15, State 1
'2023'附近语法错误。

尝试了不同的格式、类型转换等。我不能使用EXEC x..sys.sp_executesql,因为x是火鸟,而不是另一个SQL Server。

可以用另一个字符转义',即''。但是你需要对它进行双转义,也就是说,你的最后一个字符串需要有双单引号在你的动态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''')

最新更新