【问题标题】:Passing Parameter to Progress via Open Query from SQL Server - error Invalid date string从 SQL Server 通过打开查询将参数传递给进度 - 错误日期字符串无效
【发布时间】: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


【解决方案1】:

Progress Knowledge base 000034986 说明了如何格式化日期,如果您在 Google 上搜索,这是第一次点击:

site:progress.com sql92 date

由于我更喜欢​​ ISO 日期而不是任何其他猜测格式日期,所以这变成:

select top 50 t1."trn-val" as "Amount"
from myTable t1 
where t1."trn-dte" >= { d 'yyyy-mm-dd' }

我不确定您的 @sodate 是否已经采用这种格式,或者您是否需要围绕您的 adddate 进行额外的转换:

select @SOMONTH = convert( varchar, dateadd( day, 1, eomonth( getdate(), -1 ) ), 23 );

【讨论】:

    【解决方案2】:

    搞定了:

    DECLARE @TSQL varchar(8000)
    
    declare @SOMONTH date
    
    set @SOMONTH = DATEADD(DAY,1,EOMONTH(GETDATE (),-1));
    
    DECLARE @Date nvarchar(10)=convert(nvarchar(10),@SOMONTH,23)
    
    SELECT  @TSQL = 'SELECT top 50 * FROM OPENQUERY([myserver], ''SELECT * FROM mytable
    WHERE "trn-dte" >= ''''' + @Date + ''''''')'
    EXEC (@TSQL)
    

    【讨论】:

    • 那还是错的。绝对没有理由在字符串中使用OPENQUERY,没有理由使用EXEC
    • 双重错误 - 不是从链接表返回前 50 行,而是返回 everything,然后在本地丢弃除前 50 行之外的所有内容。 TOP 50 子句或FETCH NEXT .. 子句应出现在远程查询中
    • @PanagiotisKanavos 你能发表你的意思吗?我不明白没有 OPENQUERY 它将如何工作。我仅将 TOP 50 用于测试目的 - 这将在未来被删除。