1

下面的 SQL 查询正在使用链接 SQL (Oracle) 在 SQL Server 2005/2008 上运行,我得到一个错误。

Declare @PriorMonth_StartDate Datetime
Declare @PriorMonth_EndDate Datetime

Set @PriorMonth_StartDate = '2012-03-01'
Set @PriorMonth_EndDate =   '2013-10-31'

EXEC('
SELECT      *
INTO #C_INFO
FROM  OPENQUERY(ORACLE_CMIDW1,''
  SELECT A.CID, A.ANO, A.COMP_REVD_DATE, A.REVIEW_COMP_DATE, 
        A.ISSUE, B.ENT_ID, A.TYPE
FROM XXX B 
INNER JOIN YYY A ON B.ANO = A.ANO   WHERE A.REVIEW_COMP_DATE Between ''' + 
    @PriorMonth_StartDate + ''' And ''' + @PriorMonth_EndDate 
+ ''' AND Not A.ISSUE = 110 AND A.TYPE = 1 and B.ENT_ID In (2,3) 
'')')

这是错误消息:

Msg 102, Level 15, State 1, Line 9
Incorrect syntax near 'Mar'.

问题:错误信息和SQL查询有什么联系吗?看起来 SQL 正在读取日期为 2013 年 3 月 1 日之类的。如果是这种情况,它就不起作用,因为 Oracle 的格式不同。

4

1 回答 1

2

错误在您的查询构造中。让我们看看你的报价。两个单引号在要EXEC编辑的字符串中产生一个引号。因此,在 ORACLE_CMIDW1 之后,您开始将字符串发送到 Oracle。紧接着BETWEEN,你用另外两个单引号结束字符串。因此,您实际构造的字符串EXEC如下所示:

SELECT      *
INTO #C_INFO
FROM  OPENQUERY(ORACLE_CMIDW1,'
  SELECT A.CID, A.ANO, A.COMP_REVD_DATE, A.REVIEW_COMP_DATE, 
        A.ISSUE, B.ENT_ID, A.TYPE
FROM XXX B 
INNER JOIN YYY A ON B.ANO = A.ANO   WHERE A.REVIEW_COMP_DATE Between 'MAR 1, 2012' And 'MAR 5, 2013' AND Not A.ISSUE = 110 AND A.TYPE = 1 and B.ENT_ID In (2,3) ')

从代码着色中可以清楚地看出,您的字符串在您想要它之前终止了。您应该使用更多的单引号来转义引号,例如:

INNER JOIN YYY A ON B.ANO = A.ANO   WHERE A.REVIEW_COMP_DATE Between ''''' +
于 2013-07-01T17:23:18.467 回答