Sql server 如何根据字符组合拆分字符串?
我有这个字符串:Sql server 如何根据字符组合拆分字符串?,sql-server,tsql,Sql Server,Tsql,我有这个字符串: “你好,我叫#!”!乔斯佩!“。我希望输出为Jospeh。 假设我有这个字符串: “你好,我叫#!”!约瑟夫!国王。我希望我的输出为“Joseph”和“King” 我创建了一个函数: ALTER FUNCTION [dbo].[TfSplitTemplateVariable] ( @String NVARCHAR(4000) , @Delimiter NCHAR(2) ) RETURNS TABLE AS RETURN (
“你好,我叫#!”!乔斯佩!“。我希望输出为Jospeh。
假设我有这个字符串:
“你好,我叫#!”!约瑟夫!国王。我希望我的输出为“Joseph”和“King”
我创建了一个函数:
ALTER FUNCTION [dbo].[TfSplitTemplateVariable]
(
@String NVARCHAR(4000) ,
@Delimiter NCHAR(2)
)
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
)
SELECT 'Id' = ROW_NUMBER() OVER ( ORDER BY ( SELECT 1
) ) ,
'Data' = SUBSTRING(@String, stpos,
COALESCE(NULLIF(endpos, 0), LEN(@String) + 1)
- stpos)
FROM Split
)
GO
当我运行这个时:
SELECT tstv.* FROM dbo.TfSplitTemplateVariable('Hello my Name is #!Jospeh#!','#!') AS tstv WHERE ID % 2 = 0
我得到输出!乔斯佩
。
我做错了什么将
选择endpos+1
更改为选择endpos+LEN(@Delimiter)
我希望此代码符合您的需要:
ALTER FUNCTION [dbo].[TfSplitTemplateVariable]
(
@String NVARCHAR(MAX),
@Delimiter NVARCHAR(2)
)
RETURNS @result TABLE (Id INT IDENTITY PRIMARY KEY, Data NVARCHAR (MAX))
AS
BEGIN
DECLARE @start INT, @end INT
SET @start = 1
WHILE CHARINDEX(@Delimiter, @String, @start) > 0
BEGIN
SET @start = CHARINDEX(@Delimiter, @String, @start) + LEN(@Delimiter)
SET @end = CHARINDEX(@Delimiter, @String, @start)
IF @end > @start
BEGIN
INSERT @result(Data) VALUES(SUBSTRING(@String, @start, @end - @start))
END
ELSE
BEGIN
BREAK
END
SET @start = @end + LEN(@Delimiter)
END
RETURN
END
GO
您可能想阅读这篇由Dwain Camps撰写的文章:与其将代码硬编码为2,不如将其设置为
SELECT endpos+LEN(@Delimiter)