Подтвердить что ты не робот

Использование логики Switch в T-SQL

Это похоже на вопрос Noob T-SQL, но я хочу, чтобы в качестве хранимой процедуры переключался как логика, и я думал, что использование CASE было бы способом сделать это с помощью чего-то вроде

 SELECT CASE @Type
        WHEN 1 THEN
            INSERT INTO dbo.Credit (
                CompanyName,
                PhoneNumber,
                City,
                State
            ) VALUES ( 
                @CompanyName,
                @PhoneNumber,
                @City,
                @State) 
        WHEN 2 THEN  
            INSERT INTO dbo.Debit (
                CompanyName,
                PhoneNumber,
                City,
                State
            ) VALUES ( 
                @CompanyName,
                @PhoneNumber,
                @City,
                @State) 
        WHEN 3 THEN  
            --ETC
     END    

но я продолжаю получать ошибки, есть ли только ошибка systax или что я делаю на обед?

4b9b3361

Ответ 1

Вам нужно использовать структуру If/Else If, ​​например:

If @Type = 1
    Begin
        INSERT INTO dbo.Credit (
                CompanyName,
                PhoneNumber,
                City,
                State
        ) VALUES ( 
                @CompanyName,
                @PhoneNumber,
                @City,
                @State) 
    End
Else If @Type = 2
    Begin
        INSERT INTO dbo.Debit (
                CompanyName,
                PhoneNumber,
                City,
                State
        ) VALUES ( 
                @CompanyName,
                @PhoneNumber,
                @City,
                @State) 
    End
Else If @Type = 3
    Begin
        --ETC
    END

Ответ 2

Несмотря на то, что G Mastros не имеет ничего плохого, это может вызвать проблемы с планом выполнения, поскольку путь выполнения будет меняться каждый раз при выполнении процедуры. Альтернативой является использование предложения SELECT... WHERE в INSERT:

INSERT INTO dbo.Credit (
                CompanyName,
                PhoneNumber,
                City,
                State   ) 
SELECT 
                @CompanyName,
                @PhoneNumber,
                @City,
                @State
WHERE 
                @Type = 1

INSERT INTO dbo.Debit (
                CompanyName,
                PhoneNumber,
                City,
                State   ) 
SELECT 
                @CompanyName,
                @PhoneNumber,
                @City,
                @State
WHERE 
                @Type = 2

Таким образом, весь код всегда выполняется, но только тот, где совпадают символы @Type, будет "fire"

Ответ 3

Вы можете сделать что-то вроде этого:

SET @SQL = CASE @Type
            WHEN 1 THEN
                    @SQL1
            WHEN 2 THEN  
                    @SQL2
            ELSE 
                    @SQL3
     END

EXEC(@SQL)

ОБНОВЛЕНИЕ 9/18/2016

ПРИМЕЧАНИЕ. Это простое и быстрое решение, но имейте в виду, что это не долгосрочное решение, которое должно быть реализовано в производственных средах. Я согласен с @Jon Galloway: "Я не думаю, что CASE здесь подходит".

Еще одна профессиональная реализация будет заключаться в создании 3 различных хранимых процедур, которые выполняют свою собственную работу (принцип единой ответственности), что-то вроде этого:

If @Type = 1
    EXEC InsertCredit @CompanyName, @PhoneNumber, @City, @State
Else If @Type = 2
    EXEC InsertDebit @CompanyName, @PhoneNumber, @City, @State
Else If @Type = 3
    EXEC OtherInsert @CompanyName, @PhoneNumber, @City, @State

Ответ 4

Оператор CASE может быть только определенными предложениями, а не контролировать поток. Вы можете использовать его в инструкции SET или UPDATE, но ни одна из них не помогает при обновлении разных таблиц. Не изменяя вашу базу данных (например, создавая представление или что-то еще), я не думаю, что CASE здесь подходит.