包含针对OLEDB提供程序运行的CTE的查询在一台计算机上失败但在另一台计算机上运行

ror*_*.ap 1 sql-server oledb adodb common-table-expression sql-server-2008

我有以下VBScript代码在我的计算机上运行得很好(Windows 7 SP1)但无法在另一台计算机上运行(Windows XP SP3):

Dim objConn 'adodb connection object
Dim objRS 'adodb recordset object
Dim strQuery
Const adOpenStatic = 3
Const adLockReadOnly = 1
Set objConn = CreateObject("ADODB.Connection")
Set objRS = CreateObject("ADODB.Recordset")
objConn.Open "Provider=sqloledb;Data Source=" & strDBServer & ";Initial Catalog=BromsunInfo;Integrated Security=SSPI;"

strQuery = _
    "WITH CMSRATES AS " & _
    "( " & _
    "SELECT h.EMPL_UNO, h.employee_code, r.rate 'Rate', r.eff_date 'Eff Date' " & _
    "FROM " & strCMSDBServer & ".cmsopen.dbo.hbm_persnl h, " & strCMSDBServer & _
    ".cmsopen.dbo.tbm_persnl p, " & strCMSDBServer & ".CMSOPEN.dbo.TBM_RATE_FEE r " & _
    "WHERE h.empl_uno = p.empl_uno " & _
    "AND p.empl_uno = r.empl_uno " & _
    "AND R.EFF_DATE = " & _
    "(SELECT MAX(EFF_DATE) " & _
    "FROM " & strCMSDBServer & ".cmsopen.dbo.TBM_RATE_FEE R2 " & _
    "WHERE R2.RATE_LEVEL = '1' and member_type='1' AND R2.GROUP_TYPE = '4' AND R2.EMPL_UNO = P.EMPL_UNO) " & _
    "AND r.rate_level = '1' " & _
    "AND r.group_type = '4' " & _
    "AND r.member_type='1' " & _
    ") " & _
    "SELECT bu.UserID, cr.Rate, cr.EMPL_UNO " & _
    "FROM " & strDBServer & ".BromsunInfo.dbo.BromsunUsers bu " & _
    "INNER JOIN CMSRATES cr " & _
    "ON cr.employee_code = bu.Initials " & _
    "ORDER BY bu.UserDisplayName"

With objRS
    .Open strQuery, objConn, adOpenStatic, adLockReadOnly

    'Do stuff here

    .Close
End With

objConn.Close()
Run Code Online (Sandbox Code Playgroud)

我在调用objRS.Open时发生的错误是Incorrect syntax near the keyword 'WITH',这表明它不喜欢我使用CTE.这是脚本之外的查询:

WITH CMSRATES AS
(
    SELECT h.EMPL_UNO, h.employee_code, r.rate 'Rate', r.eff_date 'Eff Date'
    FROM cmsopen.dbo.hbm_persnl h, cmsopen.dbo.tbm_persnl p, CMSOPEN.dbo.TBM_RATE_FEE r 
    WHERE h.empl_uno = p.empl_uno 
    AND p.empl_uno = r.empl_uno 
    AND R.EFF_DATE = 
    (SELECT MAX(EFF_DATE) 
    FROM cmsopen.dbo.TBM_RATE_FEE R2 
    WHERE R2.RATE_LEVEL = '1' and member_type='1' AND R2.GROUP_TYPE = '4' AND R2.EMPL_UNO = P.EMPL_UNO) 
    AND r.rate_level = '1' 
    AND r.group_type = '4' 
    AND r.member_type='1' 
)

SELECT bu.UserID, cr.Rate, cr.EMPL_UNO
FROM dbo.BromsunUsers bu
INNER JOIN CMSRATES cr
ON cr.employee_code = bu.Initials
WHERE ISNULL(bu.BillingRate, -1)<>cr.Rate
ORDER BY bu.UserDisplayName
Run Code Online (Sandbox Code Playgroud)

我想知道我的Windows 7机器上的OLEDB驱动程序是否与XP机器有所不同.但是,我无法理解驱动程序的版本是如何重要的,因为查询最终将在数据库服务器上运行.

任何帮助将非常感激.

Aar*_*and 6

更改您的代码:

WITH CMSRATES AS
(
Run Code Online (Sandbox Code Playgroud)

对此:

;WITH CMSRATES AS
(
Run Code Online (Sandbox Code Playgroud)

从技术上讲,CTE不必以分号为前缀,但同一批次中的前一个语句必须以一个结尾.在其中一种情况下,提供者或代码的其他部分可能会与批处理一起发送其他命令(可能很简单SET NOCOUNT ON).

顺便说一句,这正是为什么我所有涉及CTE的答案都会看起来像后者,而不是前者(为什么我的所有代码示例都终止了每个相关的声明;- 更多信息在这里).在我的Stack Overflow职业生涯的早期,我犯了一个错误,就是从CTE开始提供答案,人们会将这些代码复制并粘贴到现有的批处理中,在那里他们根本不使用分号.突然间,我被指责导致语法错误,这是我无法预测的.:-)