2009-07-30 7 views
30

To wygląda jak pytanie T-SQL typu noob, ale chcę przełączać się jak logika w procedurze przechowywanej i myślałem, że użycie CASE byłoby sposobem na zrobienie tego z czymś takim jakprzy użyciu logiki przełączania jak w T-SQL

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  

ale ciągle dostaję błędy, czy jest tylko błąd systax lub czy robię to na lunch?

Odpowiedz

48

Trzeba użyć if/else Jeśli struktury, tak:

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 
5

CASE statement can only be certain clauses, nie kontrolować przepływ. Można go używać w instrukcji SET lub UPDATE, ale żadna z nich nie pomaga podczas aktualizowania różnych tabel. Bez zmieniania bazy danych (na przykład tworzenia widoku lub czegoś takiego), nie sądzę, że CASE pasuje tutaj.

+4

W T-SQL myślę CASE jako operatora/expresión to nie jest oświadczenie. –

11

Chociaż nie ma nic złego w odpowiedzi od G Mastros, może to spowodować problemy z planem wykonania, ponieważ ścieżka wykonania zmieni się przy każdym uruchomieniu procedury. Alternatywą jest użycie klauzuli SELECT ... gdzie we wkładce:

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 

ten sposób cały kod jest wykonywany zawsze, ale tylko jeden, gdzie @type mecze będą „ogień”

+1

Preferuję to rozwiązanie, ponieważ wygląda ono czystsze, a plan wykonania jest taki sam. –

12

ty można zrobić coś, takie jak:

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

EXEC(@SQL) 

UPDATE 9/18/2016

UWAGA: jest to proste i szybkie rozwiązanie, ale zachować Jest to rozwiązanie długoterminowe, które należy wdrożyć w środowiskach produkcyjnych. Zgadzam się z @Jon Galloway: "Nie sądzę, że CASE pasuje tutaj."

Innym bardziej profesjonalna realizacja będzie stworzenie 3 różnych procedur przechowywanych, które wykonują własną pracę (pojedyncze Responsibility zasadzie), coś takiego:

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