0

顧客を見つけるためのストアドプロシージャがあり、正常に機能しています。テーブルで null の場合Customer_City_Name、行を取得できません。SP が失敗します。これを行う方法Customer_City_Nameまたは場合でも結果を取得する必要がありますCustomer_Country_Code IS NULL

EXEC findCustomer null,'%',null,null,

SPコード:

CREATE PROCEDURE  findCustomer
  @customerNumber NVARCHAR(100),
  @customerNamePattern NVARCHAR(35),
  @customerCityNamePattern NVARCHAR(35),
  @customerCountryCode NVARCHAR(5)
AS

BEGIN
DECLARE @SQL NVARCHAR(4000)
SET @SQL =
'
SELECT
c.Customer_Number,
c.Customer_Name,
c.Postal_Address_Identifier,
c.Customer_Street_Or_Road_Name,
c.Customer_City_Name,
c.Customer_Territory_Code,
c.Customer_Postal_Code,
c.Customer_Country_Code,
c.Telephone_Number,
c.Mobile_Telephone_Number,
c.Fax_Number,
c.Email_Address 
FROM Customer c  
WHERE c.Customer_Number LIKE ' +
        CASE WHEN @customerNumber IS NOT NULL
             THEN '''' + @customerNumber + ''''
             ELSE 'c.Customer_Number'
        END + '
AND c.Customer_Name LIKE ' +
        CASE WHEN @customerNamePattern IS NOT NULL
            THEN '''' + @customerNamePattern + ''''
            ELSE 'c.Customer_Name'
        END + '
AND c.Customer_City_Name LIKE ' +
        CASE WHEN @customerCityNamePattern IS NOT NULL
            THEN '''' +@customerCityNamePattern + ''''
            ELSE 'c.Customer_City_Name'
        END + '
AND c.Customer_Country_Code LIKE ' +
        CASE WHEN @customerCountryCode IS NOT NULL
            THEN '''' +@customerCountryCode + ''''
            ELSE 'c.Customer_Country_Code'
        END

EXEC sp_executesql @SQL
4

5 に答える 5

0

Null値は他の値と比較できません。つまり、 aTrueまたは aを取得できませんFalse。この問題を回避するためにISNULL、値が null かどうかをチェックする組み込み関数を使用し、null の場合はデフォルト値を返します。

null値がオプションである各列にこの関数を適用する必要があります。

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

于 2013-07-24T06:09:49.003 に答える
0

これを行うことでこの問題を修正しました

AND ISnull(c.Customer_City_Name,'''') LIKE ' + CASE WHEN @customerCityNamePattern IS NOT NULL THEN '''' +@customerCityNamePattern + '''' ELSE 'isnull (c.Customer_City_Name,'''')' END + ' AND Isnull(c.Customer_Country_Code,'''') LIKE ' + CASE WHEN @customerCountryCode IS NOT NULL THEN '''' +@customerCountryCode + ''''ELSE 'isnull(c.Customer_Country_Code , '''')' END

1.asafrob のおかげで、私はあなたのアプローチを受け入れました。2. devio のおかげで、 'LIKE' 演算子では 'NULL'(DB) 値を選択する必要が あります。最後に、私の質問に答えてくれたすべての人に感謝します

于 2013-07-24T10:29:07.850 に答える
0

@ user2218371動的SQLの代わりに代替手段を再検討する必要があります。とにかく、これは代替コードです。

CREATE PROCEDURE  findCustomer
  @customerNumber NVARCHAR(100),
  @customerNamePattern NVARCHAR(35),
  @customerCityNamePattern NVARCHAR(35),
  @customerCountryCode NVARCHAR(5)
AS

BEGIN
DECLARE @SQL NVARCHAR(4000)
SET @SQL =
'
SELECT
c.Customer_Number,
c.Customer_Name,
c.Postal_Address_Identifier,
c.Customer_Street_Or_Road_Name,
c.Customer_City_Name,
c.Customer_Territory_Code,
c.Customer_Postal_Code,
c.Customer_Country_Code,
c.Telephone_Number,
c.Mobile_Telephone_Number,
c.Fax_Number,
c.Email_Address 
FROM Customer c  
WHERE ' + 
    CASE WHEN  @customerNumber IS NOT NULL 
        THEN ' c.Customer_Number LIKE ''' + @customerNumber + '''' + 
            CASE WHEN  @customerNamePattern IS NOT NULL THEN ' AND ' ELSE '' END
        ELSE '' 
    END  +
    CASE WHEN   @customerNamePattern IS NOT NULL 
        THEN ' c.Customer_Name LIKE ''' +  @customerNamePattern + '''' + 
            CASE WHEN  @customerCityNamePattern IS NOT NULL THEN ' AND ' ELSE '' END
        ELSE '' 
    END  + 
    CASE WHEN   @customerCityNamePattern IS NOT NULL 
        THEN ' c.Customer_City_Name LIKE ''' +  @customerCityNamePattern + '''' + 
            CASE WHEN  +@customerCountryCode IS NOT NULL THEN ' AND ' ELSE '' END
        ELSE '' 
    END  + 
    CASE WHEN    @customerCountryCode IS NOT NULL 
        THEN ' c.Customer_Country_Code LIKE ''' +  @customerCountryCode + ''''
        ELSE '' 
    END     

EXEC sp_executesql @SQL
于 2013-07-24T05:46:12.270 に答える
0

フィールドの 1 つが の場合NULLWHERE句は次のようになります。

WHERE c.Customer_Number LIKE c.Customer_Number

これはCASEステートメントの一部であるため、明らかに意図的です。

ただし、値LIKEのペアに対しては true を返しませんNULL。(NULLではありませんLIKE NULL。) これは の非常に典型的な動作ですNULL=同じことをします。

デモンストレーションについては、この非常に単純な SQL Fiddle を参照してください: http://sqlfiddle.com/#!3/82a23/3/0

これを正しく読んでいると仮定すると、プロシージャの引数が の場合、列の値を単純に無視する必要がありますNULL。その場合、クエリを調整して句を完全に除外するか、引数がNULL.

動的 SQL 構築関数 (これはすべきではありません) を使い続けることに固執する場合は、CASEステートメントに対して次のことを試してください。

WHERE ' +
CASE WHEN @customerNumber IS NOT NULL
     THEN 'c.Customer_Number LIKE ''' + @customerNumber + ''''
     ELSE '0=0'
END + '
于 2013-07-24T05:47:38.953 に答える