Я знаю, что есть несколько похожих вопросов, но у меня другие условия) Итак, проблема в следующем: у меня есть скрипт, который создан для использования на одном из связанных серверов - и он работает отлично.НО.Мне нужно настроить, чтобы запустить его как хранимую процедуру с основного сервера - эта технология уже работает нормально, есть цикл с sp_execute.Поэтому, когда я пытаюсь использовать этот сценарий как часть динамического сценария SQL, у меня появляется ошибка: Выражение не-логического типа, указанное в контексте, где ожидается условие, около 'isnull'.
Я нашел часть, которая вызвала ошибку:
SELECT
SD.ISCOMBOCOMP,
CASE SD.ISCOMBOCOMP
WHEN 0 THEN CASE WHEN isnull(SD.CREATIONDATETIME,0) < 1 THEN NULL ELSE SD.CREATIONDATETIME END
WHEN 1 THEN CASE WHEN isnull(SD2.CREATIONDATETIME,0) < 1 THEN NULL ELSE SD2.CREATIONDATETIME END
END CREATIONDATETIME,
SD.MIDSERVER,
SD.VISIT,
SD.KDSIDENT
FROM ' + @adr + '.SESSIONDISHES AS SD
Раньше все отлично работало с похожими сценариями, но вот условие isnull, и я прочитал отсюда - нормально иметь проблему с isnull в динамическом))))
Но все итерации с кодом после всех решений stackoverflow не дают мне результата.
Пожалуйста, дайте подсказку - что неверно в моем случае?
Полный запрос безобъявляет состояние WHILE и часть DYNAMIC - только хранимая процедура
SET @SQL= N'
SELECT
cast(''40''+left (R.NAME,4) AS int) AS unit
,R.NAME rest_name
,convert(nvarchar(20),GS.SHIFTDATE,112) AS datas
,MAX(KDS.ENDSERVICE) AS date_time
,MAX(KDS.auth_type) AS auth_type
,MAX(kds.pos_number) AS pos_number
,MAX(kds.pos_name) AS pos_name
,MAX(kds.pos_code) AS pos_code
,MAX(kds.pos_type) AS pos_type
,MAX(kds.order_number) AS order_number
,MAX(kds.net) AS net
,MAX(kds.gross) AS gross
,isnull(DATEDIFF(MILLISECOND,MIN(KDS.STARTSERVICE),MIN(KDS.STARTDATETIME)),0) AS order_acceptance —GET_TIME
,isnull(DATEDIFF(MILLISECOND,MIN(KDS.STARTDATETIME),MAX(KDS.CLOSEDATETIME)),0) as order_payment —PAY_TIME
— изменилось здесь
,isnull(DATEDIFF(MILLISECOND,MIN(KDS./*STARTSERVICE*/SENTAT),MAX(KDS.COLLECTEDAT)),0) as order_collect —CREATE_TIME
— изменилось здесь
,isnull(DATEDIFF(MILLISECOND,MAX(KDS.COLLECTEDAT),MAX(KDS.TAKEAT)),0) AS order_issuance —TAKE_TIME
FROM ' + @adr + '.GLOBALSHIFTS AS GS —------------------------------------------------------------------------------------------------------------------------------Globalshifts
JOIN ' + @adr + '.RESTAURANTS AS R ON R.SIFR = GS.IRESTAURANT-----------------------------------------------------------------------------------------------------Restaurants
OUTER APPLY (
SELECT
SD.ISCOMBOCOMP,
CASE
WHEN isnull(O.STARTSERVICE,0) < 1
THEN NULL
ELSE O.STARTSERVICE
END STARTSERVICE,
O.GUIDSTRING,
C.sifr AS pos_number,
C.name AS pos_name,
C.code AS pos_code,
CASE
WHEN c.code BETWEEN 1 AND 10
THEN 1
WHEN c.code BETWEEN 50 AND 58
THEN 2
WHEN c.code BETWEEN 20 AND 30
THEN 3
ELSE 0
END AS pos_type,
pc.CHECKNUM AS order_number,
pc.BINDEDSUM - pc.TAXSUM AS net,
pc.BINDEDSUM AS gross,
-------------------------------------------------------------------------------------------Ошибка тут
CASE
WHEN ct.ALTNAME = ''Credit cards''
THEN 2
WHEN ct.ALTNAME = ''Cash''
THEN 1
ELSE 0
end AS auth_type,
----------------------------------------------------------------------------------------------------—
CASE
WHEN isnull(PC.STARTDATETIME,0) < 1
THEN NULL
ELSE PC.STARTDATETIME
END STARTDATETIME,
CASE
WHEN isnull(PC.CLOSEDATETIME,0) < 1
THEN NULL
ELSE PC.CLOSEDATETIME
END CLOSEDATETIME,
isnull((SELECT MAX(F)
FROM (SELECT KDS.TAKEAT F
UNION
SELECT KDS.COLLECTEDAT
UNION
SELECT O.ENDSERVICE)T),0) ENDSERVICE,
CASE
WHEN isnull(KDS.TAKEAT,0) < 1
THEN NULL
ELSE KDS.TAKEAT
END TAKEAT,
CASE
WHEN isnull(KDS.COLLECTEDAT,0) < 1
THEN NULL
ELSE KDS.COLLECTEDAT
END COLLECTEDAT,
SD.CREATIONDATETIME SENTAT
FROM ' + @adr + '.ORDERS AS O —-----------------------------------------------------------------------------------------------------------------------------------Orders
JOIN ' + @adr + '.PRINTCHECKS AS PC ON PC.MIDSERVER = O.MIDSERVER AND PC.VISIT = O.VISIT AND PC.ORDERIDENT = O.IDENTINVISIT AND PC.STATE = 6 AND PC.IGNOREINREP = 0 —--------------------Printchecks
JOIN ' + @adr + '.CURRLINES AS CL ON CL.MIDSERVER = PC.MIDSERVER AND CL.VISIT = PC.VISIT AND CL.CHECKUNI = PC.UNI —----------------------------------------------------------------------Сurrlines
JOIN ' + @adr + '.PAYBINDINGS AS PB ON PB.MIDSERVER = CL.MIDSERVER AND PB.VISIT = CL.VISIT AND PB.CURRUNI = CL.UNI —---------------------------------------------------------------------Paybindings
CROSS APPLY (
SELECT
SD.ISCOMBOCOMP,
CASE SD.ISCOMBOCOMP
WHEN 0 THEN CASE WHEN isnull(SD.CrEATIONDATETIME,0) < 1 THEN NULL ELSE SD.CrEATIONDATETIME END
WHEN 1 THEN CASE WHEN isnull(SD2.CrEATIONDATETIME,0) < 1 THEN NULL ELSE SD2.CrEATIONDATETIME END
END CREaTIONDATETIME,
SD.MIDSERVER,
SD.VISIT,
SD.KDSIDENT
FROM ' + @adr + '.SESSIONDISHES
AS SD —--------------------------------------------------------------------------------------------------------------------------------------------Sessiondishes
LEFT JOIN ' + @adr + '.SESSIONDISHES AS SD2 ON SD2.MIDSERVER = SD.MIDSERVER and SD2.VISIT = SD.VISIT AND SD2.UNI = SD.COMBODISHUNI —---------------------------------------------------Sessiondishes
WHERE SD.MIDSERVER = PB.MIDSERVER AND SD.VISIT = PB.VISIT AND SD.UNI = PB.DISHUNI
) AS SD
LEFT JOIN ' + @adr + '.KDSDATA AS KDS ON KDS.MIDSERVER = SD.MIDSERVER AND KDS.KDSSIFR = SD.KDSIDENT —------------------------------------------------------------------------------------------------KdsData
LEFT JOIN ' + @adr + '.CASHES AS C ON c.SIFR = pc.IPRINTSTATION —------------------------------------------------------------------------------------------------------------------------------------Cashes
LEFT JOIN ' + @adr + '.CURRENCYTYPES AS CT on CT.SIFR = CL.IHIGHLEVELTYPE —--------------------------------------------------------------------------------------------------------------------------Currencytypes
WHERE O.MIDSERVER = GS.MIDSERVER AND O.ICOMMONSHIFT = GS.SHIFTNUM
AND DATEDIFF(SECOND,
CASE
WHEN ISNULL(O.STARTSERVICE,0) < 1
THEN NULL
ELSE O.STARTSERVICE
END,
CASE
WHEN ISNULL((SELECT MAX(F) FROM (SELECT KDS.TAKEAT AS F
UNION
SELECT KDS.DONEAT
UNION
SELECT O.ENDSERVICE) AS T),0) < 1
THEN NULL
ELSE (SELECT MAX(F) FROM (SELECT KDS.TAKEAT AS F
UNION
SELECT KDS.DONEAT
UNION
SELECT O.ENDSERVICE) AS T)
END) BETWEEN 0 AND 3*60*60
) AS KDS
WHERE /*r.GUIDSTRING IN (:RESTAURANT)
AND*/ gs.SHIFTDATE
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Диапазон дат
BETWEEN
GETDATE()-7 —-----------------------------------Стартовая дата
AND
GETDATE() —-------------------------------------Конечная дата
GROUP BY
R.NAME,
GS.SHIFTDATE,
KDS.GUIDSTRING'