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)
我有一个如下所示的查询。参数 @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)