2009-10-13 21 views
31

tôi cần phải chi nhánh của tôi T-SQL thủ tục lưu trữ (MS SQL 2008) điều khiển lưu lượng đến một số hướng:Dòng điều khiển trong T-SQL SP sử dụng IF..ELSE IF - có cách nào khác không?

CREATE PROCEDURE [fooBar] 
    @inputParam INT 
AS 
BEGIN 
    IF @inputParam = 1 
    BEGIN 
    ... 
    END 
    ELSE IF @inputParam = 3 
    BEGIN 
    ... 
    END 
    ELSE IF @inputParam = 3 
    BEGIN 
    ... 
    END 
END 

Có cách nào khác? Ví dụ: trong C# Tôi sẽ sử dụng khối switch-case.

+0

BEGIN/END không cần thiết trừ khi bạn đang thực hiện nhiều việc trong phần đó của logic quyết định. –

+0

@rexem: Vâng, tôi biết. Tôi cố tình viết điều này bởi vì mỗi khối chứa rất nhiều mã – abatishchev

+11

@rexem, bất cứ lúc nào tôi bỏ qua phần đầu, tôi hối hận về sau khi bảo trì khi ai đó quên thêm chúng khi họ thêm bước thứ hai vào nhánh của IF. Tôi luôn sử dụng chúng ngay bây giờ. – HLGEM

Trả lời

29

NẾU ... ELSE ... là khá nhiều những gì chúng tôi có trong T-SQL. Không có gì giống như tuyên bố CASE của chương trình có cấu trúc. Nếu bạn có một bộ mở rộng của ... ELSE NẾU ... để đối phó với, hãy chắc chắn để bao gồm BEGIN ... END cho mỗi khối để giữ cho mọi thứ rõ ràng, và luôn luôn nhớ, indentation nhất quán là bạn của bạn!

+14

Tôi luôn viết ifs của tôi và bắt đầu và kết thúc trước khi viết mã sẽ đi giữa bắt đầu và kết thúc, tiết kiệm rất nhiều gỡ lỗi sau này để đưa vào bắt đầu kết thúc trước khi bất kỳ mã nào đi vào giữa. – HLGEM

+3

Darn phải không. –

+0

có tồn tại các câu lệnh trong T-SQL – shradha

-1
CASE expression 
     WHEN value1 THEN result1 
     WHEN value2 THEN result2 
     ... 
     WHEN valueN THEN resultN 

     [ 
     ELSE elseResult 
     ] 
END 

http://www.4guysfromrolla.com/webtech/102704-1.shtml Để biết thêm thông tin.

+1

Điều này chỉ áp dụng cho các truy vấn. Tôi cần phải viết bất cứ điều gì bên trong khối, tức là nhiều dòng mã với các truy vấn khác nhau và các cuộc gọi khác của SP – abatishchev

+12

Trong T-SQL CASe là một ** EXPRESSION ** không phải là nhánh kiểm soát. Con thú rất khác nhau. –

+0

Điều này nằm ngoài ngữ cảnh câu lệnh SELECT. – hoggar

1

Nope IF là con đường để đi, vấn đề bạn gặp phải khi sử dụng nó là gì?

BTW ví dụ của bạn sẽ không bao giờ nhận được đến khối thứ ba của mã vì nó và khối thứ hai là hoàn toàn giống nhau.

+0

Yea, đó là những gì tôi cần ^) – abatishchev

8

Không, nhưng bạn nên cẩn thận khi sử dụng IF ... ELSE ... END IF trong procs được lưu trữ. Nếu các khối mã của bạn là hoàn toàn khác nhau, bạn có thể bị hiệu suất kém bởi vì kế hoạch thủ tục sẽ cần phải được tái lưu trữ mỗi lần. Nếu đó là một hệ thống hiệu suất cao, bạn có thể muốn biên dịch các procs được lưu riêng biệt cho từng khối mã và yêu cầu ứng dụng của bạn quyết định sẽ gọi proc nào vào thời điểm thích hợp.

+0

Điều này rất đúng. Nhưng nếu phân nhánh chỉ có thể xảy ra trong thủ tục (trái với ứng dụng của bạn gọi một trong nhiều thủ tục), bạn vẫn bị mắc kẹt với một loạt các câu lệnh IF. –

+0

Tên proc của tôi [execOperation] đã được gọi từ ASP.NET FormView với tham số từ danh sách thả xuống có chứa một danh sách các loại hoạt động có thể .. Vì vậy, tôi không có khả năng để có một số procs riêng biệt, thật không may – abatishchev

13

Ngoài ra, bạn có thể thử xây dựng câu trả lời của mình dưới dạng Tuyên bố SELECT CASE. Sau đó bạn có thể tạo ra đơn giản nếu sau đó sử dụng kết quả của bạn nếu cần thiết vì bạn đã thu hẹp các khả năng.

SELECT @Result = 
CASE @inputParam 
WHEN 1 THEN 1 
WHEN 2 THEN 2 
WHEN 3 THEN 1 
ELSE 4 
END 

IF @Result = 1 
BEGIN 
... 
END 

IF @Result = 2 
BEGIN 
.... 
END 

IF @Result = 4 
BEGIN 
//Error handling code 
END 
Các vấn đề liên quan