Sql server 拆分动态字符串
我需要解析动态字符串的帮助,请参见下文。此字符串可以更改为只有一组值,即两个,三个,如下所示 原始字符串:Sql server 拆分动态字符串,sql-server,tsql,reporting-services,split,charindex,Sql Server,Tsql,Reporting Services,Split,Charindex,我需要解析动态字符串的帮助,请参见下文。此字符串可以更改为只有一组值,即两个,三个,如下所示 原始字符串: valueA=valueB=valueC=valueD==valueE&valueA=valueB=valueC=valueD==valueE&valueA=valueB=valueC=valueD==valueE 最终结果:VelueB、ValueB、ValueB 我已经能够使用STUFF和CHARINDEX函数提取valueA,请参见下文,但我很难获取valueB。我
valueA=valueB=valueC=valueD==valueE&valueA=valueB=valueC=valueD==valueE&valueA=valueB=valueC=valueD==valueE
最终结果:VelueB、ValueB、ValueB
我已经能够使用STUFF和CHARINDEX函数提取valueA,请参见下文,但我很难获取valueB。我也尝试过在SSR中使用split函数来实现这一点,但没有任何结果
STUFF(( SELECT ',' + ' ' + SUBSTRING(param, 1,
CHARINDEX('=', param) - 1)
FROM dbo.Fn_mvparam(column_a, '&') AS fm
FOR
XML PATH('')
), 1, 1, ' ')
这应该做到:
REPLACE(@Param, "=", ", ")
这应该对你有好处。希望它对你有用
CREATE FUNCTION uft_DoubleSplitter
(
-- Add the parameters for the function here
@String VARCHAR(4000),
@Splitter1 CHAR,
@Splitter2 CHAR
)
RETURNS @Result TABLE (Id INT,MId INT,SValue VARCHAR(4000))
AS
BEGIN
DECLARE @FResult TABLE(Id INT IDENTITY(1, 1),
SValue VARCHAR(4000))
DECLARE @SResult TABLE(Id INT IDENTITY(1, 1),
MId INT,
SValue VARCHAR(4000))
SET @String = @String+@Splitter1
WHILE CHARINDEX(@Splitter1, @String) > 0
BEGIN
DECLARE @WorkingString VARCHAR(4000) = NULL
SET @WorkingString = SUBSTRING(@String, 1, CHARINDEX(@Splitter1, @String) - 1)
--Print @workingString
INSERT INTO @FResult
SELECT CASE
WHEN @WorkingString = '' THEN NULL
ELSE @WorkingString
END
SET @String = SUBSTRING(@String, LEN(@WorkingString) + 2, LEN(@String))
END
IF ISNULL(@Splitter2, '') != ''
BEGIN
DECLARE @OStartLoop INT
DECLARE @OEndLoop INT
SELECT @OStartLoop = MIN(Id),
@OEndLoop = MAX(Id)
FROM @FResult
WHILE @OStartLoop <= @OEndLoop
BEGIN
DECLARE @iString VARCHAR(4000)
DECLARE @iMId INT
SELECT @iString = SValue+@Splitter2,
@iMId = Id
FROM @FResult
WHERE Id = @OStartLoop
WHILE CHARINDEX(@Splitter2, @iString) > 0
BEGIN
DECLARE @iWorkingString VARCHAR(4000) = NULL
SET @IWorkingString = SUBSTRING(@iString, 1, CHARINDEX(@Splitter2, @iString) - 1)
INSERT INTO @SResult
SELECT @iMId,
CASE
WHEN @iWorkingString = '' THEN NULL
ELSE @iWorkingString
END
SET @iString = SUBSTRING(@iString, LEN(@iWorkingString) + 2, LEN(@iString))
END
SET @OStartLoop = @OStartLoop + 1
END
INSERT INTO @Result
SELECT MId AS PrimarySplitID,
ROW_NUMBER() OVER (PARTITION BY MId ORDER BY Mid, Id) AS SecondarySplitID ,
SValue
FROM @SResult
END
ELSE
BEGIN
INSERT INTO @Result
SELECT Id AS PrimarySplitID,
NULL AS SecondarySplitID,
SValue
FROM @FResult
END
RETURN
情景回答:
可能的重复我看了这些,从我所了解的值是静态的。我的字符串可以更改,因此它不能真正解决我的问题。我把标题改得更具体一些。谢谢在你的例子中,为什么输出只有值B?我需要的是输出,而不是我得到的。谢谢我明白,但为什么?逻辑是什么?删除了之前的评论,因为我能够将其合并到我的脚本中。我现在遇到的最后一个问题是,我要将这些额外的字符添加到我的结果集中,我需要删除脚本:STUFF SELECT svalue FROM dbo.F_DoubleSplittercolumn_a,,,,,,,,,=,作为fm,其中fm.mid=2表示XML路径,1,1,''结果集:'svalue>1225'请执行此操作选择','+svalue FROM dbo.F_DoubleSplittercolumn_a',&','='作为fm,其中fm.mid=2表示XML路径,1,1,我很高兴这对您有帮助。快乐编码
--FirstSplit
SELECT * FROM uft_DoubleSplitter('ValueA=ValueB=ValueC=ValueD==ValueE&ValueA=ValueB=ValueC===ValueE&ValueA=ValueB==ValueD===','&',NULL)
--Second Split
SELECT * FROM uft_DoubleSplitter('ValueA=ValueB=ValueC=ValueD==ValueE&ValueA=ValueB=ValueC===ValueE&ValueA=ValueB==ValueD===','&','=')
SELECT fn.SValue
FROM uft_DoubleSplitter('ValueA=ValueB=ValueC=ValueD==ValueE&ValueA=ValueB=ValueC===ValueE&ValueA=ValueB==ValueD===', '&', '=')AS fn
WHERE fn.mid = 2