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
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