2

我有一个问题,我有以下字符串

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'

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

4

1 回答 1

0

我稍微更新了你的功能:

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

评论后编辑:

为了防止递归限制问题,您需要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)

于 2013-05-27T10:50:19.493 回答