2012-04-23 47 views
31

Al buscar una lista de productos, el parámetro @SearchType es opcional. Si @SearchType está vacío o NULL, debe devolver todos los productos y no usar la cláusula WHERE. De lo contrario, si pasó Equipment, entonces usaría eso en su lugar.SQL Server: compruebe si la variable es Empty o NULL para la cláusula 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 

Respuesta

81

Sólo tiene que utilizar

Si es @searchType 'retorno de toda la tabla' medios nulos a continuación, utilizar

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

Si @searchType es una cadena vacía significa 'devolver toda la mesa', use

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

Si @searchType es nulo o significa una cadena vacía 'volver toda la mesa', use

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

No está funcionando. No devuelve resultados cuando paso ningún parámetro. La página de productos busca una cadena de consulta para el tipo, si no, luego establece el parámetro del método Tipo = "". Por lo tanto, creo que el proceso almacenado podría estar buscando un SearchType = "" que no arroje resultados. Quiero devolver TODOS los resultados. – User970008

+0

¡Funciona, gracias! – User970008

+0

No funciona porque está pasando una cadena vacía. ¡Una cadena vacía no es NULL! –

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

No funciona. Véase más arriba. No devuelve resultados. Debo devolver todos los resultados. – User970008

+4

No funciona porque está pasando una cadena vacía. ¡Una cadena vacía no es NULL! –

+0

@AaronBertrand, funciona. ¿Dónde está la cuerda vacía? – usefulBee

14

Si no desea pasar el parámetro cuando no se desea buscar, entonces usted debe hacer el parámetro opcional en lugar de asumir que '' y NULL son la misma cosa.

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 

Ahora bien, si se pasa NULL, una cadena vacía (''), o dejar de lado el parámetro, el dónde va a ser ignorado esencialmente cláusula.

0

Si puede utilizar alguna consulta dinámica, puede usar LEN. Dará falso en cadena vacía y nula. De esta forma puede implementar el parámetro de opció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

Mensaje viejo pero una mirada vale la pena para alguien que tropieza como yo

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

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