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

Sql server 链接服务器,使用日期字段变量打开查询,sql-server,oracle,sql-server-2008,tsql,Sql Server,Oracle,Sql Server 2008,Tsql,下面的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_INF

下面的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有不同的格式。

错误在您的查询构造中。让我们看看你的报价。两个单引号在要执行的字符串中形成一个引号。因此,在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 ''''' +

谢谢你的快速回复,杰森,我明白你的意思,但是我的约会在上面被搞砸了。日期必须是变量中的yyyy mm dd格式。我知道如何编写带有硬记录日期的sql,但我的问题发生在通过变量传递日期时。你能把上面的查询重新写一遍吗?这样我就可以看到你做了什么。这可能吗。让我知道。从OPENQUERYORACLE_CMIDW1中选择*进入C_信息,'选择A.CID、A.ANO、A.COMP_REVD_DATE、A.REVIEW_COMP_DATE、A.ISSUE、B.ENT_ID,A.TYPE_ID来自XXX B内部连接YYY A ON B.ANO=A.ANO,其中A.REVIEW_COMP_DATE介于2012-03-01和2013-10-31之间,而不是A.ISSUE=110,A.TYPE_ID=1和B.ENT_ID位于2,3'-此sql工作正常,但请查看硬编码的日期,我不想这样做。@user1810575您可以转换日期时间变量。显示了可用的格式:遗憾的是,我没有看到yyyy-mm-dd。您可以使用样式111,然后使用替换将“/”更改为“-”。您可以用日期格式变量给我一个简单的示例,或者使用我发送给您的上述sql。对不起,不知怎么的,我好像做不好。thx@user1810575下面是一个如何转换日期的示例:选择replaceconvertvarcharmax,getdate,111,'/','-'