【问题标题】:Splitting delimited strings with undefined number of delimiters使用未定义数量的分隔符拆分分隔字符串
【发布时间】:2013-05-22 02:02:19
【问题描述】:

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

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

我在 SSRS 上使用它,其中我发送一个多值参数,看起来像这样,因为 SSRS 以 CSV 格式发送多个值。

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

如何更新我的函数来处理这种情况?

【问题讨论】:

    标签: tsql reporting-services multiple-value


    【解决方案1】:

    我稍微更新了你的函数:

    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
    )
    

    这对我来说是好的结果。

    SQL Fiddle with demo

    评论后编辑:

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

    SELECT *
    FROM dbo.Split
    (
      N'0009 - The Good Boy Song,0003 - Alphabet Song,0008 - Flame-thrower Guide'
      , N','
    )
    OPTION (MAXRECURSION 0)
    

    您不能将提示应用到函数中。

    请参阅this SO question 和this MSDN 讨论以了解更多详细信息和其他潜在的解决方法。

    还有一条评论...如果您期待长字符串,也许您应该考虑将参数从NVARCHAR(4000) 更改为NVARCHAR(max)

    【讨论】:

    • 根据问题,字符串来自一个以逗号分隔的 SSRS 多值参数。如果 OP 确认他们需要您的具体案例,我可以相应地更新答案。
    • 跟我想的一样……谢谢。
    • 如果我提供超过 100 个这些值,我会不断收到递归错误,我无法加起来 OPTION(MAXRECURSION N) 为什么?
    • 我已经应用了更多细节来帮助您解决递归问题。
    • 嗨,Ian,这是完美的,这是我在函数内添加选项提示之前所做的,现在我明白了,感谢您指出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多