我的案例陈述中遇到了错误。现在我在NorthWind DB中测试它,然后在我参与的项目中使用它。 我知道我应该使用IF / ELSE,它适用于IF / ELSE,唯一的问题是我必须在函数中执行此操作而不使用存储过程。 根据我的理解,我在使用tablevalued函数时必须使用case语句,因为函数只能包含一个语句,因此需要使用一个case并且我被告知我使用IF / ELSE做的是函数不允许这种逻辑......
我将与@PreAQ一起传递一个ID,它只会返回基于过滤器的记录,这些过滤器将类似于下面所示,但有多个LIKES。
declare @PreAQ int
set @PreAQ = 0
case
when @PreAQ = 0
then
(select * from Contacts where CompanyName like 'An%')
when @PreAQ = 1
then
(select * from Contacts where ContactTitle like 'S%')
end
抛出的错误是
第15行,第1行,第7行 关键字' case'附近的语法不正确。
第15行,第11行,第1行,第11行 关键字'当'。
附近的语法不正确Msg 102,Level 15,State 1,Line 14 ' end'附近的语法不正确。
我也试过......
case @PreAQ
when = 0
then...
然后我得到了同样的错误
修改
这类似于我的功能在工作中所做的事情(除了过滤器不同和表格,但这仍然使用NorthWind作为测试数据库,注意如何取决于' @PreAQ& #39;数字,我需要它运行声明。我试图这样做......
declare @PreAQ int
set @PreAQ = 0
case
when @PreAq 0
then
(select * from [Contacts]
where (CompanyName like 'An%'
or CompanyName like 'B%'
or CompanyName like 'Ch%'
or CompanyName like 'De%'
or CompanyName like 'F%'))
when @PreAQ 1
then
(select * from [Contacts]
where (CompanyName like 'Wa%'
or CompanyName like 'Be%'
or CompanyName like 'Y%'
or CompanyName like 'DeF%'
or CompanyName like 'Fa%'
or CompanyName like 'Me%'
or CompanyName like 'Ma%'))
end
答案 0 :(得分:0)
如果要创建内联表值函数,可以使用以下内容:
create function dbo.ufn_SomeFunction(@PreAQ int)
returns table
return
(select * from Contacts
where (case when @PreAQ = 0 then CompanyName else ContactTitle end)
LIKE (case when @PreAQ = 0 then 'An%' else 'S%' end) )
请注意,您将拥有表/聚簇索引扫描。
答案 1 :(得分:0)
如果您的SQL语句变化很大,您可能需要使用动态SQL,并使用SP_EXECUTESQL
执行。请参阅此SO问题以获取示例:Dynamic SQL Server stored procedure
答案 2 :(得分:0)
这应该可行,但我同意动态SQL是一种更好的方法。
declare @PreAQ int
set @PreAQ = 1
select *
from Contacts
where (
CompanyName like case @PreAQ
when 0 then 'An%'
end
or ContactTitle like case @PreAQ
when 1 then 'S%'
end
)
答案 3 :(得分:0)
在SQLServer的TSQL中,CASE不是用于控制执行哪段代码的编程构造,而是始终返回单个数据值的expression。
尝试IF...ELSE。
if @PreAQ = 0
select * from Contacts where CompanyName like 'An%'
else if @PreAQ = 1
select * from Contacts where ContactTitle like 'S%'