37

搜索产品列表时,该@SearchType参数是可选的。如果@SearchType为空NULL,则应返回所有产品且不使用该WHERE子句。否则,如果它通过Equipment了,它将使用它来代替。

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
4

5 回答 5

99

只需使用

如果 @searchType 为 null 表示“返回整个表”,则使用

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

如果@searchType 是一个空字符串,则表示“返回整个表”,然后使用

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

如果 @searchType 为 null 或空字符串表示“返回整个表”,则使用

WHERE p.[Type] = @SearchType OR Coalesce(@SearchType,'') = ''
于 2012-04-23T16:10:50.600 回答
16

如果您不想在不想搜索时传递参数,那么您应该使参数成为可选参数,而不是假设''NULL是同一件事。

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])
  OPTION (RECOMPILE);
END
GO

现在,如果您传递NULL一个空字符串 ( ''),或者省略参数,则 where 子句将基本上被忽略。

我添加OPTION (RECOMPILE)以演示使用正确参数值可以进行搜索,并提供索引充分覆盖查询,但是如果编译发生在NULL(整个表)或返回太多行以进行搜索的参数值,则搜索是非常不可能的值得。试试看。

在此处输入图像描述

但实际上,在不应该出现扫描时往往会导致扫描的可选参数几乎肯定应该使用动态 SQL 的组合来处理,对于数据倾斜可能成为问题的参数,OPTION (RECOMPILE). 在这里查看我的“厨房水槽”方法,并试一试:

于 2012-04-23T16:19:33.880 回答
6
WHERE p.[Type] = isnull(@SearchType, p.[Type])
于 2012-04-23T16:12:41.717 回答
2

旧帖子,但值得一看像我这样偶然发现的人

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

ISNULL(NULLIF(ColumnName, ' '), NULL) IS NULL
于 2016-09-22T11:55:42.303 回答
0

如果你可以使用一些动态查询,你可以使用LEN. 它将在空字符串和空字符串上都给出错误。通过这种方式,您可以实现选项参数。

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
于 2015-10-19T07:15:53.197 回答