【发布时间】:2026-01-24 08:00:01
【问题描述】:
我正在使用 SQL Server 2014,并且正在使用 OpenQuery 从进度数据库中检索数据。
这是我的查询:
DECLARE @SOMONTH DATE;
SELECT @SOMONTH = DATEADD(DAY,1,EOMONTH(GETDATE (),-1));
SELECT t2.[Amount]
FROM OPENQUERY(MyServer,
' select top 50
t1."trn-val" as "Amount"
from myTable t1
WHERE t1."trn-dte" >= '''''' + @SOMONTH + ''''''
') AS t2
/*
Previous attempts -
WHERE t1."trn-dte" >= '''''' + CONVERT(VARCHAR(10),@SOMONTH,103) + ''''''
WHERE t1."trn-dte" >= ' + '''''' + CONVERT(VARCHAR(10),@SOMONTH,103) + '''''' + '
WHERE t1."trn-dte" >= '''''' + @SOMONTH + ''''''
WHERE t1."trn-dte" >= ' + '''''' + @SOMONTH + '''''' + '
WHERE t1."trn-dte" >= ''DATE(@SOMONTH)''
WHERE t1."trn-dte" >= TO_DATE(''@SOMONTH'')
WHERE t1."trn-dte" >= TO_DATE(''@SOMONTH'',''DD/MM/YYYY'')
WHERE t1."trn-dte" >= ''@SOMONTH''
*/
但是,我一直收到错误消息:
[DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Invalid date string (7497).
我错过了什么?
【问题讨论】:
-
据我所见,您在之前的尝试中尝试转换变量,例如,在查询中使用它之前尝试将其转换为 varchar(50)。该错误表明远程表中的日期无效,而 7497 是可以找到它的 charindex。不过不要把我的评论当作正确的,我只是想看看有什么问题,并不一定意味着它是正确的。
-
您正在使用字符串连接来创建查询,而不是传递参数。这会使您面临 SQL 注入问题和转换问题。 before 构造查询字符串,将其与 OPENQUERY 一起使用,以便您有机会检查它。创建日期文字 before 构造查询,最好以明确的格式(如
YYYY-MM-DD)并将其附加到带有正确引用的查询中。例如declare @date nvarchar(10)=convert(nvarchar(10),@SOMONTH,23)获取日期字符串,set @query=@query + '''' + @date + ''''引用并附加字符串 -
OP是你 - 原始海报。你发布的不是我写的——对于初学者来说,那里有太多的单引号。其次,不是使用带有OPENQUERY的字符串查询,而是将OPENQUERY本身放在字符串中。 -
@PanagiotisKanavos 2 分钟,错过粘贴内容
-
不要使用
EXEC。不要将OPENQUERY放在字符串中。它没有任何问题
标签: sql-server tsql date openquery progress-db