2012-04-23 7 views
31

Podczas wyszukiwania listy produktów parametr @SearchType jest opcjonalny. Jeśli @SearchType jest pusty lub NULL, powinien zwrócić wszystkie produkty i nie używać klauzuli WHERE. W przeciwnym razie, jeśli minie Equipment, to użyje tego zamiast tego.Serwer SQL: sprawdź, czy zmienna jest pusta lub NULL dla klauzuli 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 

Odpowiedz

81

Wystarczy użyć

Jeśli @searchType jest „powrót cały stół” null znaczy wtedy użyć

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

Jeśli @searchType jest pusty ciąg znaków oznacza "powrót całą tabelę a następnie za pomocą

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

Jeśli parametr @searchType ma wartość pustą lub pusty ciąg oznacza "return the whole table", a następnie użyj

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

To nie działa. Nie zwraca żadnych wyników, gdy nie przekazuję żadnego parametru. Strona produktów szuka łańcucha zapytania dla typu, jeśli nie, a następnie ustawia parametr metody Type = "". Tak wierzę, że zapisany proc może szukał SearchType = "", który nie zwraca żadnych wyników. Chcę zwrócić WSZYSTKIE wyniki. – User970008

+0

Działa, dziękuję !!! – User970008

+0

Nie działa, ponieważ podajesz pusty ciąg znaków. Pusty łańcuch nie ma wartości NULL! –

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

Nie działa. Patrz wyżej. Nie zwraca wyników, muszę zamiast tego zwracać wszystkie wyniki. – User970008

+4

Nie działa, ponieważ podajesz pusty ciąg znaków. Pusty łańcuch nie ma wartości NULL! –

+0

@AaronBertrand, to działa. Gdzie jest pusty ciąg? – usefulBee

14

Jeśli nie chcesz przekazać parametr, jeśli nie chcesz szukać, następnie należy dokonać parametr opcjonalny zamiast zakładając, że '' i NULL to samo.

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 

Teraz, jeśli przechodzą NULL, pusty łańcuch ('') lub pominąć parametr, gdy klauzula będzie w zasadzie ignorowane.

0

Jeśli możesz użyć zapytania dynamicznego, możesz użyć LEN. Poda wartość false zarówno dla łańcucha pustego, jak i pustego. W ten sposób możesz zaimplementować parametr opcji.

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

Stary post ale warto spojrzeć na kogoś, kto natyka jak ja

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

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