2016-08-10 86 views
0
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列表正在通過。我如何插入到具有動態varchar列表的表變量?此處列出的內容與我所能達到的測試格式差不多。插入到表格中逗號分隔列表中的變量值

我使用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') 
+1

在SQL Server 2016年,有一個STRING_SPLIT功能。在此之前,我想你需要編寫自己的函數。 (在這裏有split_string函數的例子。 – DVT

+0

檢查這一個http://stackoverflow.com/questions/32888266/convert-comma-delimited-string-to-table-or-array-in-sql-server-2008 -without-usin – Jag

回答

3

使用拆分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 
+0

我給了這個鏡頭,看起來它應該這樣做,我會在明天早上運行它並標記它, – Adam

+1

這是從哪裏來的[[dbo]。] [SplitStrings_Numbers] '? – Jag

+0

我現在突出顯示了這個鏈接,你可以看到一個最適合你的鏈接,所有鏈接都是同樣的工作,但是被最好的,第二個最好的分隔 – TheGameiswar

0

你需要t o創建一個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,',') 
+0

沒有必要爲此循環。這樣的行幾乎總是會比標量函數執行得更差,只是不要這樣做,下面是一些更好的選擇:http://sqlperformance.com/2012/07/t-sql-queries/split-strings –

0

這裏是一個解析器它返回序列以及。

例如:

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

返回

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

這裏要小心,這就是所謂的多狀態比較表的值函數,性能通常會比標量函數更差。將它轉換爲單個語句,以便它可以是內聯表值函數,它將是一個超級答案。 –

+0

@SeanLange感謝您的提示。我會多一點麪條。對我而言,現在,這是一個成本與便利的事情。我儘可能保持數據正常化。我傾向於只從我的網絡應用程序解析字符串,但是我的GOODNESS在解析方面存在大量問題。 –

+0

我唯一知道的是基於set,fast和return行號是Jeff Moden版本。 HTTP://www.sqlservercentral。com/articles/Tally + Table/72993 /它僅限於varchar(8000)的輸入,但返回行號的能力遠遠勝過反對它的一些論點。這裏的一些人不喜歡那個分離器,因爲它不能接受varchar(max)而沒有大規模的性能損失。 –

相關問題