tham số tùy chọn trong SQL Server được lưu trữ Proc?


125

Tôi đang viết một số procs được lưu trữ trong SQL Server 2008 và tự hỏi liệu khái niệm tham số đầu vào tùy chọn có khả thi ở đây không?

Tôi cho rằng tôi luôn có thể chuyển qua NULL cho các tham số tôi không muốn sử dụng, kiểm tra giá trị trong kho lưu trữ, sau đó lấy mọi thứ từ đó, nhưng tôi quan tâm nếu khái niệm này có sẵn ở đây. Cảm ơn!


2
Hãy đọc một thời gian dài tại trang web của Erland, anh ta có một số thông tin tuyệt vời về điều kiện tìm kiếm động: sommarskog.se/dyn-search.html
Aaron Bertrand

Câu trả lời:


201

Bạn có thể tuyên bố như thế này

CREATE PROCEDURE MyProcName
    @Parameter1 INT = 1,
    @Parameter2 VARCHAR (100) = 'StringValue',
    @Parameter3 VARCHAR (100) = NULL
AS

/* check for the NULL / default value (indicating nothing was passed */
if (@Parameter3 IS NULL)
BEGIN
    /* whatever code you desire for a missing parameter*/
    INSERT INTO ........
END

/* and use it in the query as so*/
SELECT *
FROM Table
WHERE Column = @Parameter

Điều gì xảy ra nếu tham số là loại định danh duy nhất? Ví dụ. @userId uniqueidentifier
RK Sharma

1
Trả lời @RKSharma cho bất cứ ai thắc mắc - nó cũng hoạt động tương tự với các định danh duy nhất.
rinukkusu

55

Vâng, đúng vậy. Khai báo tham số như vậy:

@Sort varchar(50) = NULL

Bây giờ bạn thậm chí không phải truyền tham số. Nó sẽ mặc định là NULL (hoặc bất cứ điều gì bạn chọn để mặc định).


Bạn thậm chí không cần= NULL
OMG Ponies

3
Bạn có chắc bạn không cần nó?
Mike Cole

43
OMG Ponies, nếu bạn không bao gồm = <NULL | một số giá trị mặc định>, thì tham số sẽ được yêu cầu. Bạn có thể chuyển nó dưới dạng NULL, nhưng sau đó bạn chỉ cần chuyển logic đó sang (các) ứng dụng sử dụng thủ tục.
Aaron Bertrand

10
Thêm vào quan điểm của Aaron. Tốt hơn là sử dụng "= NULL" nếu bạn đang thêm một tham số tùy chọn mới vào một Proc được lưu trữ hiện có. Lý do là, bạn có thể không nhận thức được TẤT CẢ mã được gọi là Proc này. Do đó, trừ khi bạn làm cho nó tùy chọn bằng cách sử dụng "= NULL", đối với tất cả các vị trí mà bạn có thể đã bỏ lỡ để vượt qua trong một giá trị, nó sẽ bị hỏng.
nanonerd

nanonerd: 2014 trở lên ít nhất bạn có thể đặt mặc định và nó sẽ nhận lỗi đó và KHÔNG gặp lỗi khi bạn không vượt qua tham số đó. Ít nhất đó là cách nó hoạt động với tôi vào năm 2014 với
billpennock

0

2014 trở lên ít nhất bạn có thể đặt mặc định và nó sẽ nhận lỗi đó và KHÔNG lỗi khi bạn không vượt qua tham số đó. Ví dụ một phần: tham số thứ 3 được thêm vào dưới dạng tùy chọn. thực hiện thủ tục thực tế chỉ với hai tham số đầu tiên hoạt động tốt

exec getlist 47,1,0

create procedure getlist
   @convId int,
   @SortOrder int,
   @contestantsOnly bit = 0
as
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.