链接服务器,使用变量为日期字段打开查询

时间:2013-07-01 17:04:51

标签: sql-server oracle sql-server-2008 tsql

使用链接SQL(Oracle)在SQL Server 2005/2008上运行以下SQL查询,我收到错误消息。

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以不同的格式使用它。

1 个答案:

答案 0 :(得分: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 ''''' +