1

私は次のような手順を実行しています:

EXEC myProcedure  @name = 'Smith',  @dateDeleted = NULL

削除された日付を持たないすべてのスミスが必要です。

そして、これは手順です:

CREATE PROCEDURE [dbo].[myProcedure]
  @name VARCHAR(8000) = NULL
 ,@dateDeleted VARCHAR(8000) = NULL

AS
BEGIN
 SET NOCOUNT ON;
    WITH t 
    (name
    ,dateDeleted
    )

AS
(
    SELECT DISTINCT 
    name,dateDeleted FROM mytable
     WHERE 
  (@name IS NULL OR @name = name)
   AND (@dateDeleted IS NULL OR CONVERT(DATETIME, @dateDeleted, 102) = dateDeleted)

)

実行後、私はすべてのスミスを持っていますが、dateDeleted=NULLには注意を払っていません..削除された日付があるかどうかに関係なくすべてのスミスを取得します

どうすればこれを修正できますか?

ありがとう

4

2 に答える 2

2

リクエストでNULLを渡すと、条件は常にtrueになります。COALESCE式を使用して次のWHERE句を試してください

   WHERE (@name IS NULL OR @name = name)
   AND (COALESCE(@dateDeleted, dateDeleted) IS NULL 
     OR CONVERT(DATETIME, @dateDeleted, 102) = dateDeleted)
于 2013-02-21T13:19:53.177 に答える
0

ansinullを設定する必要があります

実行する:

set ansi_nulls on

次に、クエリを実行します。

これがこの振る舞いの説明です

http://msdn.microsoft.com/en-us/library/ms188048.aspx

于 2013-02-21T13:02:55.463 に答える