VARCHAR范围是变量吗?

时间:2017-10-09 00:43:23

标签: sql sql-server-2012

我有一个存储过程需要通过一个选择框进行过滤,该选择框的值可以在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将不会返回任何行。

2 个答案:

答案 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) ;