1

У меня есть следующий код VBScript, который отлично работает на моем компьютере (Windows 7 SP1), но не запускается на другом компьютере (Windows XP SP3):Запрос, содержащий CTE, работающий против поставщика OLEDB, сбой на одном компьютере, но работающий на другом

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', что указывает на то, что ему не нравится мое использование КТР. Вот запрос вне сценария:

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 

Я задаюсь вопросом, есть ли что-то другое с драйвером OLEDB на моей машине Windows 7 по сравнению с машиной XP. Я не могу понять, как важна версия драйвера, поскольку запрос в конечном итоге будет запущен на сервере базы данных.

Любая помощь будет высоко оценена.

+0

Если у вас есть какая-то балансировка нагрузки на сервере? Возможно, это балансирует вас между двумя разными версиями SQL (что было бы странно странно, но кто знает)? – Joe

+0

@Joe - Нет, нет балансировки нагрузки. –

+0

Вы уверены, что подключаетесь к одному серверу? Если это так, то это должен быть драйвер - такая же версия драйвера? – Hogan

ответ

6

Изменить код из:

WITH CMSRATES AS 
(

Для этого:

;WITH CMSRATES AS 
(

Технически, КТР не должен начинаться с префикса запятой, но предыдущее заявление в том же пакете должен быть завершен одним. Вполне вероятно, что в одном из этих случаев поставщик или другие части кода отправляют другие команды вместе с пакетом (может быть так же просто, как SET NOCOUNT ON).

В качестве отскока именно поэтому все мои ответы, связанные с CTE, будут выглядеть как последние, а не предыдущие (и почему все мои образцы кода завершают каждое соответствующее заявление с помощью ; - more info on that here). В начале моей карьеры «Переполнение стека» я допустил ошибку, предоставляя ответы, начинающиеся с CTE, и люди копировали и вставляли этот код в существующую партию, где они вообще не использовали полуколоны. Внезапно меня обвинили в том, что я вызвал синтаксическую ошибку, которую я, возможно, не мог предсказать. :-)

+0

Вот и все! Мне нравится переполнение стека. Большое спасибо, Аарон. –

+1

@roryap * Ты любишь Аарона. (FTFY) – Kermit

+0

@FreshPrinceOfSO - Спасибо, человек. Вы правы, это правда. –

3

В дополнение к отличному предложению Аарона вы должны проверить (с помощью SQL Server Profiler или что-то еще) на сервере, что передается каждой машиной, когда у вас есть такая разница. Возможно, что-то проходит до with на оскорбительной машине, которая может быть решена путем добавления ;, как предлагает Аарон, или какой-либо другой более существенной разницы.

+0

Yup. Я только что подтвердил это (см. Мой ответ на ваш комментарий по моему вопросу). –

Смежные вопросы