2012-04-23 7 views
31

Khi tìm kiếm danh sách sản phẩm, thông số @SearchType là tùy chọn. Nếu @SearchType trống hoặc NULL thì nó sẽ trả về tất cả các sản phẩm và không sử dụng mệnh đề WHERE. Nếu không, nếu nó được thông qua Equipment thì nó sẽ sử dụng thay vào đó.Máy chủ SQL: kiểm tra xem biến có rỗng hay NULL cho mệnh đề WHERE

ALTER PROCEDURE [dbo].[psProducts] 
    (@SearchType varchar(50)) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     P.[ProductId], 
     P.[ProductName], 
     P.[ProductPrice], 
     P.[Type] 
    FROM [Product] P 
    -- if @Searchtype is not null then use the where clause 
    WHERE p.[Type] = @SearchType 
END 

Trả lời

81

Chỉ cần sử dụng

Nếu @searchType là 'trở lại toàn bộ bảng' vô phương tiện sau đó sử dụng

WHERE p.[Type] = @SearchType OR @SearchType is NULL 

Nếu @searchType là một chuỗi rỗng có nghĩa là 'trả lại toàn bộ bảng' sau đó sử dụng

WHERE p.[Type] = @SearchType OR @SearchType = '' 

Nếu @searchType rỗng hoặc chuỗi rỗng nghĩa là 'trả lại toàn bộ bảng', sau đó sử dụng

WHERE p.[Type] = @SearchType OR Coalesce(@SearchType,'') = '' 
+0

Nó không phải là làm việc. Nó trả về không có kết quả khi tôi vượt qua không có tham số. Trang sản phẩm tìm chuỗi truy vấn cho loại, nếu không, sau đó đặt tham số phương thức Type = "". Vì vậy, tôi tin rằng proc được lưu trữ có thể đang tìm kiếm một SearchType = "" không trả về kết quả nào. Tôi muốn trả về TẤT CẢ các kết quả. – User970008

+0

Hoạt động, cảm ơn bạn !!! – User970008

+0

Nó không hoạt động vì bạn đang truyền một chuỗi rỗng. Một chuỗi rỗng không phải là NULL! –

5
WHERE p.[Type] = isnull(@SearchType, p.[Type]) 
+1

Không hoạt động. Xem ở trên. Nó trả về không có kết quả, tôi cần phải trả về tất cả các kết quả thay thế. – User970008

+4

Nó không hoạt động vì bạn đang truyền một chuỗi rỗng. Một chuỗi rỗng không phải là NULL! –

+0

@AaronBertrand, nó hoạt động. Chuỗi rỗng ở đâu? – usefulBee

14

Nếu bạn không muốn vượt qua các tham số khi bạn không muốn tìm kiếm, sau đó bạn nên thực hiện các tham số tùy chọn thay vì giả định rằng ''NULL là những điều tương tự.

ALTER PROCEDURE [dbo].[psProducts] 
(
    @SearchType varchar(50) = NULL 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT P.[ProductId] 
    ,P.[ProductName] 
    ,P.[ProductPrice] 
    ,P.[Type] 
    FROM dbo.[Product] AS P 
    WHERE p.[Type] = COALESCE(NULLIF(@SearchType, ''), p.[Type]); 
END 
GO 

Bây giờ nếu bạn vượt qua NULL, một chuỗi rỗng (''), hoặc bỏ qua các tham số, mệnh đề where về cơ bản sẽ được bỏ qua.

0

Nếu bạn có thể sử dụng một số truy vấn động, bạn có thể sử dụng LEN. Nó sẽ cho sai trên cả chuỗi rỗng và rỗng. Bằng cách này, bạn có thể thực hiện tham số tùy chọn.

ALTER PROCEDURE [dbo].[psProducts] 
(@SearchType varchar(50)) 
AS 
BEGIN 
    SET NOCOUNT ON; 

DECLARE @Query nvarchar(max) = N' 
    SELECT 
     P.[ProductId], 
     P.[ProductName], 
     P.[ProductPrice], 
     P.[Type] 
    FROM [Product] P' 
    -- if @Searchtype is not null then use the where clause 
    SET @Query = CASE WHEN LEN(@SearchType) > 0 THEN @Query + ' WHERE p.[Type] = ' + ''''+ @SearchType + '''' ELSE @Query END 

    EXECUTE sp_executesql @Query 
    PRINT @Query 
END 
0

cùng Cũ nhưng đáng xem đối với một người tình cờ gặp như tôi

ISNULL(NULLIF(ColumnName, ' '), NULL) IS NOT NULL 

ISNULL(NULLIF(ColumnName, ' '), NULL) IS NULL