Sql server SQL Server中的自定义拆分函数
我试图在SQL Server中创建一个拆分函数,该函数拆分字符串并为我提供第n个子字符串,但我没有足够的SQL经验来实现它 理想情况下,我想写作 选择拆分选择“级别a:级别b:级别c:级别d',':',3 它将返回c级 部分答案就在这里Sql server SQL Server中的自定义拆分函数,sql-server,function,Sql Server,Function,我试图在SQL Server中创建一个拆分函数,该函数拆分字符串并为我提供第n个子字符串,但我没有足够的SQL经验来实现它 理想情况下,我想写作 选择拆分选择“级别a:级别b:级别c:级别d',':',3 它将返回c级 部分答案就在这里 但我无法将其转换为我想要的功能。使用StringSplit函数,但必须是sql server 2016或更高版本 字符串\拆分字符串、分隔符 从字符串中选择*拆分“约翰,杰里米,杰克”,“我想这就是你想要的 create FUNCTION dbo.SplitAr
但我无法将其转换为我想要的功能。使用StringSplit函数,但必须是sql server 2016或更高版本 字符串\拆分字符串、分隔符
从字符串中选择*拆分“约翰,杰里米,杰克”,“我想这就是你想要的
create FUNCTION dbo.SplitArrayIndex
(
@InputString NVARCHAR(MAX) ,
@Delimiter VARCHAR(50) ,
@index INT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @ret NVARCHAR(MAX)
DECLARE @Items TABLE
(
id INT IDENTITY(1, 1) ,
Item NVARCHAR(MAX)
)
IF @Delimiter = ' '
BEGIN
SET @Delimiter = ','
SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
END
IF ( @Delimiter IS NULL
OR @Delimiter = ''
)
SET @Delimiter = ','
DECLARE @Item NVARCHAR(MAX)
DECLARE @ItemList NVARCHAR(MAX)
DECLARE @DelimIndex INT
SET @ItemList = @InputString
SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
WHILE ( @DelimIndex != 0 )
BEGIN
SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
INSERT INTO @Items
VALUES ( @Item )
-- Set @ItemList = @ItemList minus one less item
SET @ItemList = SUBSTRING(@ItemList, @DelimIndex + 1,
LEN(@ItemList) - @DelimIndex)
SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
END -- End WHILE
IF @Item IS NOT NULL -- At least one delimiter was encountered in
@InputString
BEGIN
SET @Item = @ItemList
INSERT INTO @Items
VALUES ( @Item )
END
-- No delimiters were encountered in @InputString, so just return
@InputString
ELSE
INSERT INTO @Items
VALUES ( @InputString )
SELECT TOP 1
@ret = Item
FROM @Items
WHERE id = @index
RETURN @ret
END -- End Function
我想这就是你想要的 速度与SQL内置/系统函数STRING\u SPLIT函数相同 如果对象ID为'[dbo].[fnVRS_字符串\u拆分]',则'IF'为空 EXEC'CREATE FUNCTION[dbo].[fnVRS\u STRING\u SPLIT]将表格返回为返回选择1 X' 终止 去 ALTER函数[dbo]。[fnVRS\u字符串\u拆分] @字符串nvarcharMAX, @分离器nvarcharMAX 返回带有SCHEMABINDING的表 作为回报 在XN为的情况下,从值0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 TC中选择“表1”, YN AS从X A1、X A2、X A3、X A4、X A5、X A6、X A7、X A8中选择“表2”,最多16^8=40亿 TN作为选择TOPISNULLLEN@string,通过从Y中选择NULL-1 N,订单上的行数为0, DelimPos AS从t中选择t.N,其中SUBSTRING@string,t.N,LEN@separator+“x'-1类似于分隔符或t.N=0, Separatedvalue作为SELECTSUBSTRING@string,d.位置+LEN@separator+“x'-1,前置位置,12147483647通过选择空-前置位置-LEN@separator 从德利姆d 其中@string不为NULL 选择s.value 从分离的 其中s.value@分隔符 去
这无法获取第n项,因为内置字符串拆分的结果是一个没有索引列的表,这意味着您只能获得一组未排序的子字符串。这可能是SQL Server中拆分字符串的最糟糕方法。阅读Aaron Betrand的文章了解更多信息。一段时间是一个糟糕的解决方案。分割字符串有更好的方法,例如XML分割器、计数分割器、CLR函数、JSON字符串分割器和内置的字符串分割函数。@ZoharPeled说,作为一个选项,暂时是一个漫长的过程。我仍然不喜欢这篇文章的某些部分,因为关于杰夫·摩登的拆分器的信息并不是一个真正的比较。他的Jeff's splitter故意不支持MAX数据类型,但本文中所有关于它的比较都使用了经过修改的MAX版本;导致性能大大降低。@Larnu Jeff和Aaron在本文的评论中详细讨论了这一点。我同意使用varchar8000比使用varcharmax要快得多,但这仍然是我所知道的关于SQL Server字符串拆分器性能比较的文章中最好的一篇……我知道他们是这样做的,@ZoharPeled;如果Aaron使用MAX和non-MAX版本重新访问它,那就太好了。人们不经常阅读评论,因此会使用实际上不正确的信息。我推荐。但是,老实说,我建议您修复您的设计。我建议您完全在SQL Server之外进行修复。字符串操作不是SQL Server的强项。这不是它设计的目的。如果您真的必须在SQL中执行此操作,我认为基于XML/Json的解决方案可能是此提示的最佳选择:您可能根本不需要拆分字符串