Insert into Table 来自逗号分隔列表的变量值

Insert into Table Variable values from a comma separated list

declare @List   varchar(25) = '2,3,4'
declare @Delinquencies  table (id int);
insert into @Delinquencies(id) values('2'),('3'),('4'); --Line in question

@List 正在填充一个字符串,该字符串从他们选择的 SSRS 报告中填充。现在我的存储过程是 运行,我需要能够根据正在处理的 varchar 列表插入到我的 table 变量中。如何使用动态 varchar 列表插入 table 变量?这里列出的是我能想到的最接近测试格式的内容。

我正在使用 SQL Server 2008。

示例

@List = '1'
insert into @Delinquencies(id) values('1')

以及最多

的任意组合
@List = '1,2,3,4'
insert into @Delinquencies(id) values('1'),('2'),('3'),('4')

使用拆分之一 string functions from here..

declare @List   varchar(25) = '2,3,4';
declare @Delinquencies  table (id int);

;with cte
as
(select * from
[dbo].[SplitStrings_Numbers](@list,',')
)

insert into @Delinquencies(id)
select * from cte

你需要创建一个dbo.StringSplit函数

它有两个参数(字符串,分隔符)

CREATE function [dbo].[StringSplit](
 @String varchar (max),
 @Delimiter nvarchar (10)
 )
returns @ValueTable table ([Value] varchar(max))
begin
 declare @NextString varchar(max)
 declare @Pos int
 declare @NextPos int
 declare @CommaCheck nvarchar(1)

 --Initialize
 set @NextString = ''
 set @CommaCheck = right(@String,1) 

 --Check for trailing Comma, if not exists, INSERT
 --if (@CommaCheck <> @Delimiter )
 set @String = @String + @Delimiter

 --Get position of first Comma
 set @Pos = charindex(@Delimiter,@String)
 set @NextPos = 1

 --Loop while there is still a comma in the String of levels
 while (@pos <>  0)  
 begin
  set @NextString = substring(@String,1,@Pos - 1)

  insert into @ValueTable ( [Value]) Values (@NextString)

  set @String = substring(@String,@pos +1,len(@String))

  set @NextPos = @Pos
  set @pos  = charindex(@Delimiter,@String)
 end

 return
end

然后你就可以像下面这样使用了

declare @List   varchar(25) = '2,3,4'
SELECT value from dbo.StringSplit(@List,',')

这是一个解析器,returns 序列也是如此。

例如:

Select * from [dbo].[udf-Str-Parse]('126,256,512',',')

Returns

Key_PS  Key_Value
1       126
2       256
3       512

UDF

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimeter varchar(10))
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
--       Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')

Returns @ReturnTable Table (Key_PS int IDENTITY(1,1), Key_Value varchar(max))
As
Begin
   Declare @XML xml;Set @XML = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML)
   Insert Into @ReturnTable Select Key_Value = ltrim(rtrim(String.value('.', 'varchar(max)'))) FROM @XML.nodes('x') as T(String)
   Return 
End