1

我有以下在我的計算機(Windows 7 SP1)上運行良好但無法在另一臺計算機上運行的VBScript代碼(Windows XP SP3):查詢包含針對OLEDB提供程序運行的CTE在一臺計算機上失敗,但在另一臺計算機上運行的查詢

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驅動程序的不同的東西。但是,我無法理解驅動程序的版本是如何重要的,因爲查詢最終將在數據庫服務器上運行。

任何幫助將不勝感激。

+0

有沒有機會在服務器上進行某種負載均衡?也許它會在兩個不同版本的SQL之間平衡你(這將會非常奇怪,但是誰知道)? – Joe

+0

@Joe - 不,沒有負載平衡。 –

+0

你確定你連接到同一臺服務器嗎?如果是這樣,那麼它必須是驅動程序 - 驅動程序的相同版本? – Hogan

回答

6

更改您的代碼:

WITH CMSRATES AS 
(

要這樣:

;WITH CMSRATES AS 
(

技術上,CTE不必用分號作爲前綴,但在同一批次前面的語句必須以一個終止。很可能在這些情況下,供應商或代碼的其他部分與批次一起發送其他命令(可能與SET NOCOUNT ON一樣簡單)。另外,這正是爲什麼我涉及CTE的所有答案都看起來像後者,而不是前者(以及爲什麼我的所有代碼樣本都終止了每個相關語句,爲什麼要用;-more info on that here)。在我的Stack Overflow職業生涯初期,我犯了一個以CTE開頭的錯誤,人們會將該代碼複製並粘貼到現有的批處理中,他們根本沒有使用分號。突然之間,我因爲導致我無法預測的語法錯誤而受到指責。 :-)

+0

這樣做!我愛堆棧溢出。非常感謝,亞倫。 –

+1

@ roryap *你愛亞倫。 (FTFY) – Kermit

+0

@FreshPrinceOfSO - 謝謝,夥計。你是對的,這是真的。 –

3

除了Aaron的出色建議之外,當你有這樣的差別時,你應該在服務器上檢查(通過SQL Server Profiler或其他的)在每臺機器上傳遞什麼。有可能在with之前通過違規機器通過了一些可以通過像Aaron所建議的那樣添加;或其他更重要的區別來解決的問題。

+0

是的。我剛剛證實(請參閱我對我的問題的評論)。 –

相關問題