SQL Server通过OPENQUERY查询Firebird时参数化datetime报错求助
解决SQL Server通过OPENQUERY查询Firebird的Datetime参数问题
错误原因
你遇到的Token unknown - @错误,核心原因是OPENQUERY中的SQL语句会直接发送到Firebird执行,而Firebird不识别SQL Server的参数语法@test1。sp_executesql的参数仅作用于SQL Server本地,无法传递到链接服务器的查询中。
解决方案
方案1:使用EXECUTE ... AT实现参数化查询(推荐)
这是SQL Server针对链接服务器的官方参数化查询方式,能自动处理跨服务器的数据类型转换,彻底避免日期格式问题和SQL注入风险:
DECLARE @days INT DECLARE @start DATETIME DECLARE @end DATETIME SET @days = 1 SET @end = GETDATE() SET @start = DATEADD(DAY, -@days, @end) -- 用?作为Firebird的参数占位符,通过WITH子句传递SQL Server变量 EXECUTE ('SELECT * FROM SALE WHERE MODIFIED >= ?') AT x WITH @start
方案2:构造Firebird兼容的日期字符串(拼接SQL方式)
如果无法使用EXECUTE ... AT,可以将SQL Server的datetime转换为Firebird支持的'YYYY-MM-DD HH:MI:SS'格式字符串,拼入查询语句:
DECLARE @days INT DECLARE @start DATETIME DECLARE @end DATETIME DECLARE @startStr NVARCHAR(20) DECLARE @TEST nvarchar(max) SET @days = 1 SET @end = GETDATE() SET @start = DATEADD(DAY, -@days, @end) -- 转换为Firebird兼容的日期格式字符串 SET @startStr = CONVERT(NVARCHAR(20), @start, 120) -- 注意用两个单引号转义查询中的单引号,避免语法错误 SET @TEST = N'SELECT * FROM OPENQUERY(x,'+CHAR(39)+'SELECT * FROM SALE WHERE MODIFIED >= ''' + @startStr + ''''+CHAR(39)+')' EXEC sp_executesql @TEST
内容的提问来源于stack exchange,提问作者Guitoux
相关产品推荐
相关产品推荐

