Sql server 如何在存储过程中使用循环拆分逗号分隔的字符串而不使用out

Sql server 如何在存储过程中使用循环拆分逗号分隔的字符串而不使用out,sql-server,sql-server-2005,sql-server-2008,Sql Server,Sql Server 2005,Sql Server 2008,如何使用循环拆分逗号分隔的字符串而不使用out 例如:- 我有一个字符串,它的逗号分隔为4,3,5,2,5,9 如果我想在不使用循环的情况下获取第三个逗号后的字符串。如果我们知道为什么不能使用循环,这会有所帮助,但您可以使用自定义CLR函数,该函数可能会在后台使用循环,或者: 所以,拆分的意思是分成两个相等的部分?你只想返回一个值吗?不,我只需要从第3个逗号到第4个逗号获取字符串。我如何获取第n个逗号的值。行号应该分配实际字符串顺序,我必须从实际顺序获取字符串。 DECLARE @S varch

如何使用循环拆分逗号分隔的字符串而不使用out

例如:-

我有一个字符串,它的逗号分隔为4,3,5,2,5,9

如果我想在不使用循环的情况下获取第三个逗号后的字符串。

如果我们知道为什么不能使用循环,这会有所帮助,但您可以使用自定义CLR函数,该函数可能会在后台使用循环,或者:


所以,拆分的意思是分成两个相等的部分?你只想返回一个值吗?不,我只需要从第3个逗号到第4个逗号获取字符串。我如何获取第n个逗号的值。行号应该分配实际字符串顺序,我必须从实际顺序获取字符串。
DECLARE @S varchar(max),
  @Split char(1),
  @X xml

SELECT @S = '1,2,3,4,5',
  @Split = ','

SELECT @X = CONVERT(xml,'<root><s>' + REPLACE(@S,@Split,'</s><s>') + '</s></root>')

SELECT [Value] = T.c.value('.','varchar(20)')
FROM @X.nodes('/root/s') T(c)
DECLARE @S varchar(max),
  @Split char(1),
  @X xml

SELECT @S = '1,2,3,4,5',
  @Split = ','

SELECT @X = CONVERT(xml,'<root><s>' + REPLACE(@S,@Split,'</s><s>') + '</s></root>')

SELECT TOP 1 Value
FROM
(    
    SELECT [Value] = T.c.value('.','varchar(20)'), 
                ROW_NUMBER() OVER (ORDER BY 
                    CASE 
                        WHEN T.c.value('.', 'varchar(20)') = 0
                        THEN 0 
                        ELSE 0 
                    END ASC) AS Ordinal
    FROM @X.nodes('/root/s') T(c)
) iq
WHERE iq.Ordinal = 3
DECLARE @str varchar(MAX)='001,002,03,0004,05,6,07'
    ,@separator char(1)=','
    ,@n int = 3;

WITH str_nums ( id, n1, n2 ) 
AS 
( 
SELECT CAST(1 as int) as id, CAST(0 as bigint) as n1, CHARINDEX(@separator, @str+@separator) as n2
UNION ALL
SELECT id + 1, n2 as n1, CHARINDEX(@separator, @str+@separator, n2+1) as n2
FROM str_nums
WHERE n2<len(@str)
) 

SELECT SUBSTRING(@str, n1+1, n2-n1-1) as n_str
FROM str_nums
WHERE id = @n
GO