Использование логики 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 или что я делаю на обед?
Ответы
Ответ 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 здесь подходит.