2013-07-24 31 views
0

我已存儲過程來找到客戶,其工作的罰款。如果Customer_City_Name在表中爲空,那麼我無法檢索該行。 SP失敗。如何做到這一點 我得導致即使Customer_City_NameCustomer_Country_CodeIS 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 '''' [email protected] + '''' 
      ELSE 'c.Customer_City_Name' 
     END + ' 
AND c.Customer_Country_Code LIKE ' + 
     CASE WHEN @customerCountryCode IS NOT NULL 
      THEN '''' [email protected] + '''' 
      ELSE 'c.Customer_Country_Code' 
     END 

EXEC sp_executesql @SQL 
+3

GEEZ!請**重新格式化**並清理您的文章 - 這是一個巨大的混亂! ***請***突出顯示文本編輯器中的代碼行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」),以良好地格式化和語法突出顯示它! –

+0

您有一個生成動態SQL並執行它的存儲過程。你不能使用參數化查詢嗎?他們不太容易注射。 – jpmc26

回答

0

我有固定的這個問題由 'LIKE + 這樣

和ISNULL(c.Customer_City_Name, ''')' CASE WHEN @customerCityNamePattern IS NOT NULL THEN''''+ @ customerCityNamePattern +'''' ELSE'isnull(c。Customer_City_Name, '' '')」 END + ' 和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 In 'LIKE' operator needs to select 'NULL'(DB) values我從 得到了主意3.感謝jpmc26 - >我喜歡你的答案。 最後感謝每一位回答我的問題

+0

在我的回答中,我沒有對此做足夠清楚的說明,但是您的動態SQL非常容易受到SQL注入攻擊。考慮參數化查詢或至少某種輸入驗證。 – jpmc26

+0

這是唯一的方法..我可以產生例外的結果 – RAGKV

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 [email protected] 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 
0

當領域之一是NULL,你WHERE條款如下:

WHERE c.Customer_Number LIKE c.Customer_Number 

這顯然是故意的,因爲它是CASE報表的組成部分。

然而,LIKE不會爲一對NULL值返回true。 (NULL不是LIKENULL)這是NULL相當典型行爲。 =做同樣的事情。

見這個非常簡單的SQL搗鼓一個示範: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 + ' 
0

Null值不能與其他任何值進行比較,這意味着你不不會得到TrueFalse。 要解決此問題,我使用ISNULL內置函數檢查值是否爲空,如果它是返回您的默認值。

您應該應用此功能,其中一個null值是一個選項,每列。

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

0

哥哥,所以您的查詢主要是執行選擇功能來搜索現有的客戶信息

嘗試修改你的WHERE條件爲樣本如下

Select .... 
From ..... 
WHERE (@Customer_Number is null or c.Customer_Number like @Customer_Number + '%') 
AND (@customerNamePattern is null or c.Customer_Name like @customerNamePattern + '%') 
AND (@customerCityNamePatternis null or c.Customer_City_Name like @customerCityNamePattern+ '%') 
AND (@customerCountryCode is null or c.c.Customer_Country_Code like @customerCountryCode + '%') 
+0

感謝您的信息 這是一個客戶搜索,我爲這段代碼添加了分頁,所以我添加了動態SQL。最簡單的解決方法是更新表中的所有四列不爲空? – RAGKV

+0

對不起?所以你現在的問題是用非空列值更新你的表?這是模糊的,你能更新你的問題嗎?^___^ –