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



我有以下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()

我得到的错误发生在调用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

我想知道我的Windows 7机器上的OLEDB驱动程序与XP机器相比是否有不同。 但是,我不明白驱动程序的版本有什么关系,因为查询最终将在数据库服务器上运行。

任何帮助将不胜感激。

将代码从:

WITH CMSRATES AS
(

对此:

;WITH CMSRATES AS
(

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

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

除了 Aaron 的出色建议之外,当您遇到这样的差异时,您应该在服务器上检查(使用 SQL Server 探查器或其他方法)每台机器传递的内容。 在with之前,有问题的机器可能会传递一些东西,这可以通过添加 Aaron 建议的;来解决,或者其他一些更显着的差异。

最新更新