Tsql 使用未定义的分隔符数拆分分隔字符串

Tsql 使用未定义的分隔符数拆分分隔字符串,tsql,reporting-services,multiple-value,Tsql,Reporting Services,Multiple Value,我有一个问题,我有下面一行字符串 0009 - The Good Boy Song 0003 - Alphabet Song 0008 - Flame-thrower Guide 我有一个拆分函数,目前有两个参数 ALTER FUNCTION [dbo].[Split] ( @String NVARCHAR(4000), @Delimiter NCHAR(1) ) RETURNS TABLE AS RETURN ( WITH Split(stpos,endpos) AS(

我有一个问题,我有下面一行字符串

0009 - The Good Boy Song
0003 - Alphabet Song
0008 - Flame-thrower Guide
我有一个拆分函数,目前有两个参数

ALTER FUNCTION [dbo].[Split]
(
 @String NVARCHAR(4000),
 @Delimiter NCHAR(1)
)
RETURNS TABLE 
AS
RETURN 
(

WITH Split(stpos,endpos) 
AS(
    SELECT 0 AS stpos, CHARINDEX(@Delimiter2,@String) AS endpos
    UNION ALL
    SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
        FROM Split
        WHERE endpos > 0
)
SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
    'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split
)
我需要确保输出类似于

Id       Data
0009 The Good Boy Song
0003 Alphabet Song
0008 Flame-thrower Guide
0009 The Good Boy Song
0003 Alphabet Song
0008 Flame
thrower Guide
而不是像这样

Id       Data
0009 The Good Boy Song
0003 Alphabet Song
0008 Flame-thrower Guide
0009 The Good Boy Song
0003 Alphabet Song
0008 Flame
thrower Guide
我在SSRS上使用它,在这里我发送一个多值参数,它看起来是这样的,因为SSRS以CSV形式发送多个值

'0009 - The Good Boy Song,0003 - Alphabet Song,0008 - Flame-thrower Guide'

如何更新我的函数以处理此情况?

我已稍微更新了您的函数:

ALTER FUNCTION [Split]
(
 @String NVARCHAR(4000),
 @Delimiter NCHAR(1)
)
RETURNS TABLE 
AS
RETURN 
(

WITH Split(stpos,endpos) 
AS(
    SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
    UNION ALL
    SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
        FROM Split
        WHERE endpos > 0
)
, SplitData AS
(
  SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
      'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
  FROM Split
)
SELECT ID
  , NumericData = SUBSTRING(Data, 1, 4)
  , TextData = SUBSTRING
    (
      Data
      , 8
      , len(Data) - 7
    )
FROM SplitData
)
这对我来说是个不错的结果

评论后编辑:

为防止递归限制出现问题,需要在函数外部设置
MAXRECURSION
,即使用
SELECT
语句调用时:

SELECT *
FROM dbo.Split
(
  N'0009 - The Good Boy Song,0003 - Alphabet Song,0008 - Flame-thrower Guide'
  , N','
)
OPTION (MAXRECURSION 0)
您不能在函数编写时将提示应用到函数中

有关更多详细信息和其他可能的解决方法,请参见SO问题和MSDN讨论


还有一条评论。。。如果你期待长字符串,也许你应该考虑将参数从<代码> NVARCHAR(4000)< /代码>改为<代码> NVARCHAR(MAX)< /C> > /P>,根据该问题,字符串来自一个SSR多值参数,它是逗号分隔的。如果OP确认他们需要你的具体案例,我可以相应地更新答案。就像我想的那样。。。谢谢。如果我提供了大约100多个这样的值,我会不断得到递归错误,我无法添加选项(MAXRECURSION N)为什么?我已经应用了一些更详细的信息来帮助解决递归问题。嗨,伊恩,这很完美,这是我在函数中添加选项提示之前所做的,现在我明白了,谢谢你指出它。