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)为什么?我已经应用了一些更详细的信息来帮助解决递归问题。嗨,伊恩,这很完美,这是我在函数中添加选项提示之前所做的,现在我明白了,谢谢你指出它。