2011-03-10 53 views
3

有人有一个好的,快速的SQL Server函数,它将带有一个分隔符的字符串并将其作为表返回?SQL Server字符串到表函数

感谢

+0

我强烈推荐的文章,可用从http://www.sommarskog.se/arrays-in-sql.html(SQL Server数组和列表)中可以了解许多不同的方法。 – Enull 2011-03-10 13:59:25

回答

7
CREATE FUNCTION dbo.fnSplit(
    @sInputList VARCHAR(8000) -- List of delimited items 
    , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items 
) RETURNS @List TABLE (item VARCHAR(8000)) 

BEGIN 
DECLARE @sItem VARCHAR(8000) 
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 
BEGIN 
SELECT 
    @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), 
    @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) 

IF LEN(@sItem) > 0 
    INSERT INTO @List SELECT @sItem 
END 

IF LEN(@sInputList) > 0 
INSERT INTO @List SELECT @sInputList -- Put the last item in 
RETURN 
END 
GO 
--Test 
select * from fnSplit('1,22,333,444,,5555,666', ',') 
select * from fnSplit('1##22#333##444','##') --note second item has embedded # 
select * from fnSplit('1 22 333 444 5555 666', ' ') 
+1

优秀的解决方案!非常清楚,简短和直接。 – 2012-07-27 14:43:02

1

平添了几分扭曲,以获得结果条目是整数和杠杆SQL的NVARCHAR(MAX)功能2008+

GO 
/****** Object: UserDefinedFunction [dbo].[udf_fnSplit] Script Date: 05/28/2013 15:22:00 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE FUNCTION [dbo].[udf_fnSplit](
    @sInputList VARCHAR(MAX) -- List of delimited items 
    , @sDelimiter VARCHAR(MAX) = ',' -- delimiter that separates items 
) RETURNS @List TABLE (id int) 

BEGIN 
DECLARE @sItem VARCHAR(8000) 
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 
BEGIN 
SELECT 
    @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), 
    @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) 

IF LEN(@sItem) > 0 
    INSERT INTO @List SELECT CONVERT(INT,@sItem) 
END 

IF LEN(@sInputList) > 0 
INSERT INTO @List SELECT @sInputList -- Put the last item in 
RETURN 
END