SQL 带有可选参数的服务器 WHERE 子句未按预期工作

SQL Server WHERE Clause with optional parameter not working as expected

我有一个如下所示的查询。参数 @company 在 .NET 代码中是可选的。

当我传递该值时,它按预期工作并为此 @company 带来匹配结果。当我不传递值时,它应该 return 更多行,对于所有其他公司也是如此。不知何故,它没有 returning 任何东西。

我知道我们可以编写动态 SQL 并添加该条件(如果它不为空)。但是还有其他更好的捷径吗?

感谢您的回复。

declare @company varchar(20) = 'AAA'

select distinct 
    fname as first_name, u.lname as last_name, 
    sc.company as employed_by, 
    sc.short_description as employed_by_company_name, 
    u.user_code
from 
    users u
inner join 
    sis_companies sc on sc.company = u.company 
inner join 
    sis_carriers car on sc.company = sc.company
inner join 
    carrier_shipper_contact_roles cashro on car.carrier = cashro.carrier
where 
    cashro.carrier = 'CPL'
    and (isnull(sc.company, '') = '' or sc.company = @company)

谢谢

正如@Lamak 所说,您应该 使用 ISNULL(SC.Company,'')='' 获取所有公司

你应该有如下内容

select 
    distinct fname as first_name, u.lname as last_name, 
    sc.company as employed_by
        , sc.short_description as employed_by_company_name, u.user_code
    from users u
        inner join sis_companies sc on sc.company = u.company 
            inner join sis_carriers car on sc.company = sc.company
            inner join carrier_shipper_contact_roles cashro on car.carrier = cashro.carrier
    Where cashro.carrier = 'CPL'
      and (@company is NULL or sc.company = @company)

如果您想传递空字符串并获取所有公司,那么

select 
    distinct fname as first_name, u.lname as last_name, 
    sc.company as employed_by
        , sc.short_description as employed_by_company_name, u.user_code
    from users u
        inner join sis_companies sc on sc.company = u.company 
            inner join sis_carriers car on sc.company = sc.company
            inner join carrier_shipper_contact_roles cashro on car.carrier = cashro.carrier
    Where cashro.carrier = 'CPL'
      and (NULLIF(@company,'') is NULL or sc.company = @company)

我想你想要这个

and (isnull(@company, '') = '' or sc.company = @company)