我有一个存储过程需要通过一个选择框进行过滤,该选择框的值可以在0到3之间。该值对应于表,其中每个int值可以有两个或多个与之关联的VARCHAR
值。例如,0可以分配给'A' 'B'
或'C'
,而1可以分配到'D'
或'E'
我试图将这些选项存储为变量@m
,其设置如下:
DECLARE @m varchar(50) =
CASE
WHEN @mid = 0
THEN N'''A'',''B'',''C'',''D'',''E'''
WHEN @mid = 1
THEN N'''A'',''B'''
WHEN @mid = 2
THEN N'(''C'',''D'')'
ELSE N'''E'''
END
如果我自己返回预期值,那么返回预期值,'
标记和,
分隔符位于正确的位置。但是当我尝试用它从我的桌子中选择正确的记录时,我什么都没得到。
select @m --Returns 'C','D','E'
select * from table where mValue in (@m) -- Returns nothing
select * from table where mValue in ('C','D','E') -- Returns all expected rows
如果我在@m
变量中有括号,那么它没有任何区别,那么第二个select
将不会返回任何行。
答案 0 :(得分:2)
正如戈登所提到的,你必须创建一个用于分割字符串的函数。我使用下面的逻辑(如果它始终由,
分隔)
CREATE FUNCTION [dbo].[fn_split_string] ( @stringToSplit VARCHAR(MAX) )
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE CHARINDEX(',', @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(',', @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END
然后您可以在查询中使用此功能。
select * from table where mValue in (select * from fn_split_string (@m))
答案 1 :(得分:1)
一种方法是拆分@m
。您可以在Web上找到各种“拆分”功能(该功能已在SQL Server 2016中添加)。
然后想法做的事情是:
with m(item) as (
select *
from dbo.split(@m, ',') s
)
select *
from table
where mValue in (select item from m) ;