0

我有存储过程来寻找客户,它工作正常。如果Customer_City_Name表中为空,则我无法检索该行。SP 失败。如何做到这一点我必须得到结果,即使Customer_City_NameCustomer_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

@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

兄弟,所以你的查询主要是执行选择功能来搜索现有的客户信息

尝试修改您的 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 + '%' )
于 2013-07-24T06:20:00.110 回答
0

Null值不能与任何其他值进行比较,这意味着您没有得到 aTrue或 a False。为了解决这个问题,我使用了ISNULL内置函数来检查该值是否为空,如果它返回您的默认值。

您应该将此函数应用于null值是一个选项的每一列。

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

于 2013-07-24T06:09:49.003 回答
0

当其中一个字段是NULL时,您的WHERE子句如下所示:

WHERE c.Customer_Number LIKE c.Customer_Number

这显然是故意的,因为它是CASE陈述的一部分。

但是,对于一对值LIKE不会返回 true 。NULLNULL不是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 回答
0

我已经通过这样做解决了这个问题

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

1.感谢 asafrob 我接受了你的方法。2. 感谢 devio 在 'LIKE' 操作员需要选择 'NULL'(DB) 值 我从 3.Thanks to jpmc26 --> 我喜欢你的回答。最后感谢每一个回答我问题的人

于 2013-07-24T10:29:07.850 回答