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. 空文字列と null 文字列の両方で false を返します。このようにして、オプション パラメータを実装できます。

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 に答える