gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:34:39 26 4
gpt4 key购买 nike

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

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

如有任何帮助,我们将不胜感激。

最佳答案

更改您的代码:

WITH CMSRATES AS
(

对此:

;WITH CMSRATES AS
(

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

顺便说一句,这正是我所有涉及 CTE 的答案看起来像后者而不是前者的原因(以及为什么我所有的代码示例都以 ; - more info on that here 终止每个相关语句) .在我 Stack Overflow 职业生涯的早期,我错误地提供了以 CTE 开头的答案,人们会将该代码复制并粘贴到现有批处理中,而他们根本不使用分号。突然间,我因导致我无法预料的语法错误而受到指责。 :-)

关于sql-server - 包含针对 OLEDB 提供程序运行的 CTE 在一台计算机上失败但在另一台计算机上运行的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21266194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com