用分隔符分隔字符串并分配给变量-sql

用分隔符分隔字符串并分配给变量-sql,sql,sql-server,delimiter,Sql,Sql Server,Delimiter,我有字符串'sunday,monday,thrisday'我想把它们分开,并把它们分配给变量@day1,@day2,@day3。有时,叮咬的天数会有所不同。如何在sql中实现这一点 试试下面的方法 DECLARE @day1 varchar(10), @day2 varchar(10), @day3 varchar(10), @day4 varchar(10) DECLARE @Split TABLE (N int IDENTITY, S varchar(200)) INSE

我有字符串
'sunday,monday,thrisday'
我想把它们分开,并把它们分配给变量
@day1,@day2,@day3
。有时,叮咬的天数会有所不同。如何在sql中实现这一点

试试下面的方法

DECLARE
  @day1 varchar(10),
  @day2 varchar(10),
  @day3 varchar(10),
  @day4 varchar(10)

DECLARE @Split TABLE (N int IDENTITY, S varchar(200))

INSERT @Split (S) SELECT value FROM STRING_SPLIT('sunday,monday,thursday',',')

SELECT
  @day1=MAX(CASE WHEN N=1 THEN S END),
  @day2=MAX(CASE WHEN N=2 THEN S END),
  @day3=MAX(CASE WHEN N=3 THEN S END),
  @day4=MAX(CASE WHEN N=4 THEN S END) -- is null
FROM @Split

-- check
SELECT @day1,@day2,@day3,@day4
带有CTE的变体

DECLARE
  @day1 varchar(10),
  @day2 varchar(10),
  @day3 varchar(10),
  @day4 varchar(10),
  @day5 varchar(10),
  @day6 varchar(10),
  @day7 varchar(10)

DECLARE @input varchar(100)='sunday,monday,thursday'

;WITH sCTE AS(
  SELECT
    1 n,
    NULLIF(LEFT(@input,ISNULL(NULLIF(CHARINDEX(',',@input)-1,-1),LEN(@input))),'') s,
    IIF(CHARINDEX(',',@input)=0,'',RIGHT(@input,LEN(@input)-CHARINDEX(',',@input))) p
  UNION ALL
  SELECT
    n+1,
    LEFT(p,ISNULL(NULLIF(CHARINDEX(',',p)-1,-1),LEN(p))) s,
    IIF(CHARINDEX(',',p)=0,'',RIGHT(p,LEN(p)-CHARINDEX(',',p))) p
  FROM sCTE
  WHERE p<>''
)
SELECT
  @day1=MAX(CASE WHEN N=1 THEN S END),
  @day2=MAX(CASE WHEN N=2 THEN S END),
  @day3=MAX(CASE WHEN N=3 THEN S END),
  @day4=MAX(CASE WHEN N=4 THEN S END),
  @day5=MAX(CASE WHEN N=4 THEN S END),
  @day6=MAX(CASE WHEN N=4 THEN S END),
  @day7=MAX(CASE WHEN N=4 THEN S END)
FROM sCTE

-- check
SELECT @day1,@day2,@day3,@day4,@day5,@day6,@day7

创建了一个动态sql查询。我不知道它有多高效

查询

declare @days as varchar(max) = 'sunday,monday,thursday';

declare @t as table([id] int not null identity(1, 1), [value] varchar(100));
insert into @t([value])
select [Value] from String_Split(@days, ',');

declare @i as int;
select @i = count(*) from @t;

declare @j as int;
set @j = 1;

declare @sql1 as varchar(max) = '';
declare @sql2 as varchar(max) = '';

while(@j <= @i)
begin
  select @sql1 += 'declare @day' + cast(@j as varchar(10)) + ' as varchar(100);'
               +  'set @day' + cast(@j as varchar(10)) + ' = '
               + char(39)
               + (select [value] from @t where [id] = @j) 
               + char(39)
               + ';';

  select @sql2 += '@day' + cast(@j as varchar(10)) 
               + ' as [@day' + cast(@j as varchar(10)) + '] ,';          

  set @j += 1;
end

select @sql2 = 'select ' + left(@sql2, len(@sql2) - 1);

declare @sql as varchar(max) = @sql1 + @sql2;

exec(@sql);
将@days声明为varchar(max)=“周日、周一、周四”;
将@t声明为表([id]int非空标识(1,1),[value]varchar(100));
插入@t([值])
从字符串_Split(@days,,')中选择[Value];
声明@i为int;
从@t中选择@i=count(*);
声明@j为int;
设置@j=1;
将@sql1声明为varchar(max)='';
将@sql2声明为varchar(max)='';

while(@j什么是
Sql server
版本?Sql server 2016使用函数以逗号分割字符串并将每个值分配给变量。有时字符串包含4天,那么如何处理变量?字符串包含的1-7天(任意数字)。我们应该应用什么逻辑?作为变量,您可以添加
@day4=MAX(N=4时的情况为S端),…,@day7=MAX(N=7时的情况为S端)
。如果您只有3天,那么
@day4,…,@day7
变量将为
NULL
。例如,我在我的答案中添加了
@day4
变量。您的输入字符串是否可以是这样的
星期一、星期二、星期五
?如果是真的,在这种情况下会发生什么?
@day1=周一;@day2=周二;@day3=friday
e> @day2=星期一;@day3=星期二;@day6=星期五
?对于我们的特定数据库,他们正在使用可比性级别110。我现在能做什么?我刚刚在我的答案中添加了两个其他变量。
declare @days as varchar(max) = 'sunday,monday,thursday';

declare @t as table([id] int not null identity(1, 1), [value] varchar(100));
insert into @t([value])
select [Value] from String_Split(@days, ',');

declare @i as int;
select @i = count(*) from @t;

declare @j as int;
set @j = 1;

declare @sql1 as varchar(max) = '';
declare @sql2 as varchar(max) = '';

while(@j <= @i)
begin
  select @sql1 += 'declare @day' + cast(@j as varchar(10)) + ' as varchar(100);'
               +  'set @day' + cast(@j as varchar(10)) + ' = '
               + char(39)
               + (select [value] from @t where [id] = @j) 
               + char(39)
               + ';';

  select @sql2 += '@day' + cast(@j as varchar(10)) 
               + ' as [@day' + cast(@j as varchar(10)) + '] ,';          

  set @j += 1;
end

select @sql2 = 'select ' + left(@sql2, len(@sql2) - 1);

declare @sql as varchar(max) = @sql1 + @sql2;

exec(@sql);