2009-07-30 48 views
30

Điều này trông giống như một câu hỏi T-SQL noob nhưng tôi muốn chuyển đổi như logic trong một thủ tục lưu trữ và tôi đã nghĩ rằng sử dụng CASE sẽ là cách để làm điều này với một cái gì đó nhưsử dụng Switch like logic trong 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  

nhưng tôi vẫn gặp lỗi, chỉ có lỗi systax hoặc là những gì tôi đang làm cho bữa trưa?

Trả lời

48

Bạn cần phải sử dụng Nếu/Else Nếu cấu trúc, như thế này:

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

Các CASE statement can only be certain clauses, không để kiểm soát dòng chảy. Bạn có thể sử dụng nó trong một câu lệnh SET hoặc UPDATE, nhưng cả hai đều không trợ giúp khi bạn cập nhật các bảng khác nhau. Nếu không thay đổi cơ sở dữ liệu của bạn (ví dụ: tạo chế độ xem hoặc thứ gì đó), tôi không nghĩ rằng CASE phù hợp ở đây.

+4

Trong T-SQL Tôi nghĩ của CASE như một nhà điều hành/expresion không phải là một tuyên bố. –

11

Trong khi không có gì sai với câu trả lời của G Mastros, nó có thể gây ra các vấn đề về kế hoạch thực thi vì đường dẫn thực thi sẽ thay đổi mỗi lần thủ tục được chạy. Một cách khác là sử dụng SELECT ... WHERE trong 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 

Bằng cách này tất cả các mã luôn được thực hiện, nhưng chỉ có một nơi @type phù hợp sẽ 'lửa'

+1

Tôi thích giải pháp này vì nó trông sạch hơn cũng như giữ kế hoạch thực hiện giống nhau. –

12

Bạn có thể làm một cái gì đó như thế này:

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

EXEC(@SQL) 

CẬP NHẬT 9/18/2016

Chú ý: Đây là một giải pháp dễ dàng và nhanh chóng, nhưng giữ trong tâm trí đây là một giải pháp không lâu dài được thực hiện trong môi trường sản xuất. Tôi đồng ý với @Jon Galloway: "Tôi không nghĩ rằng CASE là nội dung phù hợp tại đây".

Một thực hiện chuyên nghiệp hơn sẽ tạo ra 3 thủ tục khác nhau được lưu trữ mà làm công việc của mình (đơn Trách nhiệm Nguyên tắc), một cái gì đó như thế này:

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 
Các vấn đề liên quan