2014-09-03 74 views
0
CREATE FUNCTION [dbo].[Split] 
( 
    @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 'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos) 
FROM Split 
) 
GO 

如何散佈包括逗號,句點和空格在內的詞?目前它正在分裂逗號所在的位置。SQL UDF分詞並返回表

+1

如果你要正確對待所有逗號,句號和空格一樣的,爲什麼不使用REPLACE()將它們全部改爲逗號傳遞第一@String之前地點? – 2014-09-03 04:14:47

回答

0

在這裏你去,並credit to the source

CREATE FUNCTION dbo.[UDF_Split_Based_On_Multiple_Delimiters] 
(
     @String VARCHAR(MAX), -- Variable for string 
     @delimiter VARCHAR(50) -- Delimiter in the string 
) 
RETURNS @Table TABLE(  --Return type of the function 
Splitcolumn VARCHAR(MAX) 
) 
BEGIN 
     DECLARE @Xml AS XML 
     DECLARE @REVISED_STRING VARCHAR(MAX) 

     ;WITH N1 (n) AS (SELECT 1 UNION ALL SELECT 1), 
     N2 (n) AS (SELECT 1 FROM N1 AS X, N1 AS Y), 
     N3 (n) AS (SELECT 1 FROM N2 AS X, N2 AS Y), 
     N4 (n) AS (SELECT ROW_NUMBER() OVER(ORDER BY X.n) 
     FROM N3 AS X, N3 AS Y) 

     SELECT @REVISED_STRING=STUFF((SELECT '' + (Case When 
       PATINDEX('%[' + @delimiter + ']%',SUBSTRING(@String,Nums.n,1)) >0 
       Then ',' else LTRIM(RTRIM(SUBSTRING(@String,Nums.n,1))) end) 
     FROM N4 Nums WHERE Nums.n<=LEN(@String) FOR XML PATH('')),1,0,'') 

     SET @Xml = cast(('<a>'+replace(@REVISED_STRING, 
       ',','</a><a>')+'</a>') AS XML) 

     INSERT INTO @Table SELECT A.value('.', 'varchar(max)') 
       as [Column] FROM @Xml.nodes('a') AS FN(a) 
RETURN 
END 
GO