You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:25:34