【发布时间】:2017-05-06 04:37:16
【问题描述】:
我正在使用以下格式的员工层次结构字符串。这些数字代表employeeID 数字以及它们在公司内部的结构,从而能够遵循管理链。
123|456|789|012|345|320
我正在尝试获取此数据字符串并将其转换为临时表,以便我可以将每个 ID 用作它们自己的值。
我尝试制作一个函数来拆分字符串:
ALTER FUNCTION [dbo].[SplitString]
(@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
)
SELECT
'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(@String, stpos, COALESCE(NULLIF(endpos, 0), LEN(@String) + 1))
FROM
Split
)
然而,这导致了以下结果:
Id Data
-------------------
1 123
2 456|7893
3 7893|012|345|
4 012|345|320
5 345|320
6 320
有没有更好的方法来解决这个问题,可能根本不需要函数或者需要它来实现这个?
【问题讨论】:
-
有更好的方法来处理字符串拆分函数,是的。 Here 是一个很好的参考。但至于你的问题,可以通过改变一个部分来解决:
COALESCE(NULLIF(endpos,0) - stpos, LEN(@String)+1)
标签: sql-server tsql stored-procedures split sql-server-2012