Sql server 在Sql server in循环中读取逗号分隔字符串

Sql server 在Sql server in循环中读取逗号分隔字符串,sql-server,split,nvarchar,Sql Server,Split,Nvarchar,我有如下nvarchar数据: ‘20030200312003320034200652004520044’ 我想通过拆分成数组来读取所有这些内容,或者在拆分过程中逐个读取这些内容,然后进行进一步的处理 我已经尝试过了,但是没有成功。尝试使用此函数读取逗号分隔的值并返回表 CREATE FUNCTION dbo.Split(@String nvarchar(4000), @Delimiter char(1)) RETURNS @Results TABLE (Items nvarchar(4000)

我有如下nvarchar数据:

‘20030200312003320034200652004520044’

我想通过拆分成数组来读取所有这些内容,或者在拆分过程中逐个读取这些内容,然后进行进一步的处理

我已经尝试过了,但是没有成功。

尝试使用此函数读取逗号分隔的值并返回表

CREATE FUNCTION dbo.Split(@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (Items nvarchar(4000))
AS
BEGIN
DECLARE @INDEX INT
DECLARE @SLICE nvarchar(4000)
-- HAVE TO SET TO 1 SO IT DOESNT EQUAL Z
--     ERO FIRST TIME IN LOOP
SELECT @INDEX = 1
WHILE @INDEX !=0
BEGIN
-- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
-- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
IF @INDEX !=0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT @SLICE = @STRING
-- PUT THE ITEM INTO THE RESULTS SET
INSERT INTO @Results(Items) VALUES(@SLICE)
-- CHOP THE ITEM REMOVED OFF THE MAIN STRING
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
-- BREAK OUT IF WE ARE DONE
IF LEN(@STRING) = 0 BREAK
END
RETURN
END
只需从存储过程调用函数,或只需按如下方式调用函数:

SELECT items FROM [dbo].[Split] ('20030,20031,20033,20034,20065,20045,20044', ',') 

一点也不难。最好使用递归来解决这个问题

create table #Testdata2(Data varchar(max))
insert #Testdata2 select '20030,20031,20033,20034,20065,20045,20044'



;with tmp(DataItem, Data) as (
select LEFT(Data, CHARINDEX(',',Data+',')-1),
    STUFF(Data, 1, CHARINDEX(',',Data+','), '')
from #Testdata2
union all
select LEFT(Data, CHARINDEX(',',Data+',')-1),
    STUFF(Data, 1, CHARINDEX(',',Data+','), '')
from tmp
where Data > ''
)
select DataItem
from tmp
OPTION (maxrecursion 0)
输出:

(select)
 Data
 ----------------
 20030,20031,20033,20034,20065,20045,20044


(query)
DataItem
----------------
20030
20031
20033
20034
20065
20045
20044

使用字符串拆分和Xml的另一种方法

DECLARE @string nvarchar(max)='20030,20031,20033,20034,20065,20045,20044'
DECLARE @Table AS TABLE (String nvarchar(max))
INSERT INTO @Table
SELECT @string

SELECT Row_NUmber ()OVER(ORDER BY (SELECT 1) )AS Seq, Split.a.value('.', 'VARCHAR(1000)') AS String
            FROM  (
                SELECT   CAST('<S>' + REPLACE(String, ',', '</S><S>') + '</S>' AS XML) AS String
                FROM @Table
                ) AS A
            CROSS APPLY String.nodes('/S') AS Split(a) 

不能怎么办?你试过了吗?张贴你的代码和任何错误?那些不知道答案的人请不要投反对票,请在评论中说我犯的错误或给出答案的人犯的错误,如果你不能,请不要投反对票。thanks@padhiyar当前位置请尝试我的答案并告诉我是否正确works@padhiyar-阅读本文,了解如何在网站上发布问题。否则他们将被关闭:我投反对票,因为这个问题没有显示任何研究成果。你链接了一篇文章,但没有解释为什么你不能用这篇文章来解决你的问题,或者为什么互联网上的任何其他文章都不能帮助你。这是一个非常常见的问题,不需要再问关于堆栈溢出的问题。@Milney:谢谢你的知识。请分享一些文章来证明你的话?另外,如果您有解决方案,一定要让我们知道。我很想找到替代方法是的。这里有一个:如果你只是谷歌t-sql拆分字符串,有很多…未来提示:递归解决方案很少是解决问题的最佳方式谢谢。虽然没有说CTE的性能很差。我使用了CTE和递归,我相信这不是一种糟糕的方法。@PrabhatG我有一个与您非常相似的分割函数,我很满意(和我自己)。。。然而,我对理货方法的性能感到惊讶。下面将演示计数和xml方法。。。看一眼,
CREATE FUNCTION dbo.udf_Split (
    @String NVARCHAR(4000)
    ,@Delimiter CHAR(1)
    )
RETURNS @Results TABLE (Items NVARCHAR(4000))
AS
BEGIN
    DECLARE @Table AS TABLE (String NVARCHAR(max))

    INSERT INTO @Table
    SELECT @String

    INSERT INTO @Results
    SELECT Split.a.value('.', 'VARCHAR(1000)') AS String
    FROM (
        SELECT CAST('<S>' + REPLACE(String, @Delimiter, '</S><S>') + '</S>' AS XML) AS String
        FROM @Table
        ) AS A
    CROSS APPLY String.nodes('/S') AS Split(a)

    RETURN
END

SELECT ROW_NUMBER()OVER(ORDER BY (SELECT 1))AS Seq,
    * FROM dbo.udf_Split('20030,20031,20033,20034,20065,20045,20044',',')
Seq String
----------
1   20030
2   20031
3   20033
4   20034
5   20065
6   20045
7   20044
DECLARE @valueList varchar(8000)
DECLARE @pos INT
DECLARE @len INT
DECLARE @value varchar(8000)

SET @valueList = '20030,20031,20033,20034,20065,20045,20044,' -- added delimiter to end of string

set @pos = 0
set @len = 0

WHILE CHARINDEX(',', @valueList, @pos+1)>0
BEGIN
    set @len = CHARINDEX(',', @valueList, @pos+1) - @pos
    set @value = SUBSTRING(@valueList, @pos, @len)

    PRINT(@value)   
    -- write your logic here
    set @pos = CHARINDEX(',', @valueList, @pos+@len) +1
END