используя Switch как логику в T-SQL - PullRequest
34 голосов
/ 30 июля 2009

Это похоже на новый вопрос 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    

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

Ответы [ 4 ]

56 голосов
/ 30 июля 2009

Вам нужно использовать структуру 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
17 голосов
/ 24 февраля 2012

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

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
11 голосов
/ 30 июля 2009

Хотя в ответе 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 соответствует, будет запускаться

7 голосов
/ 30 июля 2009

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

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