Выражение не булева типа, указанное в контексте, где ожидается условие, близкое к 'isnull' - PullRequest
0 голосов
/ 05 февраля 2019

Я знаю, что есть несколько похожих вопросов, но у меня другие условия) Итак, проблема в следующем: у меня есть скрипт, который создан для использования на одном из связанных серверов - и он работает отлично.НО.Мне нужно настроить, чтобы запустить его как хранимую процедуру с основного сервера - эта технология уже работает нормально, есть цикл с 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'
...