Как я могу использовать переменную в константе when в выражении case - PullRequest
0 голосов
/ 30 сентября 2019

Я работаю над sql-script, который считывает неправильные наборы данных. например, набор данных неверен, когда @differenz больше 0 (это означает, что конец начинается с начала)

, поэтому я спрашиваю в выражении case, если differenz больше нуляпоставить единицу, если она верна, или ноль, если нет, но я не могу вызвать переменную @differenz Я получил эту ошибку Должен объявить скалярную переменную "@differenz".

Как я могу вызвать эту переменную

USE [ws_Benjamin]
GO

/****** Object:  View [fu].[FUanalyse]    Script Date: 30.09.2019 13:43:25 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO




DECLARE @differenz bigint
DECLARE @fidFirst bigint
DECLARE @beginFirst bigint
DECLARE @endFirst bigint
DECLARE @fidSecond bigint
DECLARE @beginSecond bigint
DECLARE @endSecond bigint

DECLARE @first as TABLE
(
    fidFirst bigint,
    beginFirst bigint,  
    endFirst bigint
)

DECLARE @second as TABLE
(
    fidSecond bigint,
    beginSecond bigint,  
    endSecond bigint
)
DECLARE myCursor CURSOR FOR 
    SELECT fid, DATUMZEITBEGIN, DATUMZEITEND FROM fu.FUrearranged 
    order by fid

OPEN myCursor
FETCH NEXT FROM myCursor INTO @fidFirst, @beginFirst,@endFirst

WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT FROM myCursor INTO @fidSecond, @beginSecond, @endSecond
        if (@endFirst-@beginSecond)>0
            begin

                set @differenz = (@endFirst-@beginSecond)
                --print 'there it is'
            end
        else
            begin
                set @differenz = -100
            end     
END

CLOSE myCursor -- must to close
DEALLOCATE myCursor -- must to deallocate

go
ALTER VIEW [fu].[FUanalyse]
as
--with fus(personFID ,anzahlFU) as ( select fu.FUrearranged.fid, ranked from fu.FUrearranged)

select id, fid, dbfid, ranked, typ, datum, F1,F2,F3,G1,G2,G3,datumzeitbegin,datumzeitend,

case
when substring(typ, 4, 8) = 'ärztlich' and austritt between convert(datetime, STUFF(STUFF(STUFF(datumzeitbegin,13,0,':'),11,0,':'),9,0,' '),121) and 
                                                                                                  convert(datetime, STUFF(STUFF(STUFF(datumzeitend,13,0,':'),11,0,':'),9,0,' '),121) and 
                                                                                                  eintritt < convert(datetime, STUFF(STUFF(STUFF(datumzeitbegin,13,0,':'),11,0,':'),9,0,' '),121) then '1'
/*when substring(typ, 4, 8) = 'ärztlich' and eintritt > convert(datetime, STUFF(STUFF(STUFF(datumzeitbegin,13,0,':'),11,0,':'),9,0,' '),121) and
                                                                                 austritt < convert(datetime, STUFF(STUFF(STUFF(datumzeitend,13,0,':'),11,0,':'),9,0,' '),121) then 'Ungültig (Aufenthalt kürzer als FU)'
when datumzeitend is null then 'Ungültig (Enddatum nicht vorhanden)'*/
else '0'
end as FUlaufend,
case
when substring(typ, 4, 8) = 'ärztlich' and eintritt > convert(datetime, STUFF(STUFF(STUFF(datumzeitbegin,13,0,':'),11,0,':'),9,0,' '),121) and
                                                                                 austritt < convert(datetime, STUFF(STUFF(STUFF(datumzeitend,13,0,':'),11,0,':'),9,0,' '),121) then '1'
else '0'
end as FUzuKurz,
case
when G1 = 0 and G2 = 0 and G3 = 0 then '1'
else '0'
end as G_Ungültig,
case  
when F1 = 0 and F2 = 0 and F3 = 0 then '1'
else '0'
end as F_Ungültig,
case
when DATUMZEITEND = null then '1'
else '0'
end as FUkeinEnddatum,
case
when @differenz > 0 then '1'
else '0'
end as F_Überscheindung

from fu.FUrearranged
GO

1 Ответ

0 голосов
/ 30 сентября 2019

Это вызвано вашими операторами GO, они представляют новый пакет запросов, поэтому переменные не переносятся после GO. Однако вы изменяете представление, которое требуется SQL для того, чтобы быть первым оператором пакета, поэтому удаление GO не будет работать в вашем случае.

Я бы предложил сделать что-то вроде этого

create view test as select 1 a

select * from test

declare @a int = 2;
declare @sql_statement nvarchar(250) ='alter view test as select '+CAST(@a as nvarchar)+' as a';
EXECUTE sp_executesql @sql_statement;

Вы можете создать свой вид представления Alter как строку и затем выполнить его с помощью хранимой процедуры sp_executesql, так что вам не нужен GO для выполнения вида Alter.


Редактировать: будьте предельно осторожны с тем, что вы перетаскиваете в sp_executesql, действительно легко вызвать SQL-инъекцию, если вы используете его небрежно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...