Frage

I have a problem, I have the following line of strings

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

I have a split function that currently takes two parameters,

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
)

I need to make sure that the ouput is something like

Id       Data
0009 The Good Boy Song
0003 Alphabet Song
0008 Flame-thrower Guide

and not something like

0009 The Good Boy Song
0003 Alphabet Song
0008 Flame
thrower Guide

I'm using this on SSRS, where in I'm sending a multiple valued argument, it looks like this as SSRS sends multiple values in CSV form.

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

How I update my function to handle this scenario?

War es hilfreich?

Lösung

I've updated your function slightly:

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
)

This is giving OK results for me.

See SQL Fiddle with demo.

Edit after comment:

To prevent issues with the recursion limit you need to set MAXRECURSION outside of the function, i.e. when you're calling it with a SELECT statement:

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

You cannot apply the hint in the function as it's written.

See this SO question and this MSDN discussion for further details and other potential workarounds.

One more comment... If you are expecting long strings, maybe you should consider changing the parameter from NVARCHAR(4000) to NVARCHAR(max)?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top