2016-11-10 90 views
-2

爲了拆分分隔字符串,我需要創建一個函數來返回一個表格並以逗號分隔的字符串作爲參數。創建一個函數將分隔字符串拆分爲表格

例如,看看這個輸入表:

enter image description here

使用功能,其結果必然是:

enter image description here

在這種情況下,分隔字符串Person列應該作爲參數。

在此先感謝。如果你想要做上面的函數從您的意見

,這個遠遠超過上述簡單:

+0

http://stackoverflow.com/questions/2696884/split-value-from-one-field-to-two –

+0

ü可以檢查我的答案... @ pravesh.kan – Chanukya

+0

張貼問題後,你必須檢查答案,它是滿足你的要求,你必須接受.. @ pravesh.kan – Chanukya

回答

0

嘗試此查詢

//Which will work only when having 3 comma only 


     SELECT Id,SUBSTRING_INDEX(SUBSTRING_INDEX(`Person`, ',', 1), ',', -1) as Person 
      FROM `table` 
     UNION 
     select Id,SUBSTRING_INDEX(SUBSTRING_INDEX(`Person`, ',', 2), ',', -1) as Person 
      FROM `table` 
     UNION 
     select Id,SUBSTRING_INDEX(SUBSTRING_INDEX(`Person`, ',', 3), ',', -1) as Person 
      FROM `table` 
    order by Id ASC 
0

試試這個

--Build Schema for Your Case 

    DECLARE @TAB TABLE (ID INT, NAME VARCHAR(1000)) 
    INSERT INTO @TAB 
    SELECT 1,'Pravesh,Simon' 
    UNION ALL 
    SELECT 2,'Me,Myself,I' 


    --Used Recursive CTE to achieve Tabular view of Comma Separated Column 
    --Used While loop to take next row 
    --Used Table Variable @RESULT to store your Result Set 

    DECLARE @ID INT, @T VARCHAR(100), @SNO INT= 1, @MAX_SNO INT 
    DECLARE @RESULT TABLE (ID INT, NAME VARCHAR(1000)) 


    SELECT @SNO=1, @MAX_SNO =MAX(ID) FROM @TAB 

    WHILE(@SNO<[email protected]_SNO) 
    BEGIN 
    SELECT @ID = ID, @T = NAME FROM @TAB WHERE [email protected] 
    SET @T [email protected]+',' 


    ;WITH MyCTE(Start,[End]) AS(

    SELECT 1 AS Start,CHARINDEX(',',@T,1) AS [End] 
    UNION ALL 
    SELECT [End]+1 AS Start,CHARINDEX(',',@T,[End]+1)AS [End] 
    from MyCTE where [End]<LEN(@T) 
    ) 

    INSERT INTO @RESULT 

    Select @SNO AS ID, SUBSTRING(@T,Start,[End]-Start) NAME from MyCTE; 


    SET @SNO+=1 
    END 

    --Getting Result Set 

    SELECT * FROM @RESULT 

編輯循環。

CREATE FUNCTION [DBO].[FN_SPLIT_STR_TO_COL] (@T AS VARCHAR(4000)) 
    RETURNS 
    @RESULT TABLE(VALUE VARCHAR(250)) 
    AS 
    BEGIN 
     SET @T= @T+',' 
      ;WITH MYCTE(START,[END]) AS(

     SELECT 1 AS START,CHARINDEX(',',@T,1) AS [END] 
     UNION ALL 
     SELECT [END]+1 AS START,CHARINDEX(',',@T,[END]+1)AS [END] 
     FROM MYCTE WHERE [END]<LEN(@T) 
     ) 
     INSERT INTO @RESULT 
     SELECT SUBSTRING(@T,START,[END]-START) NAME FROM MYCTE; 

      RETURN 
    END 

現在只需通過將列傳遞給它來調用每一行的函數。

隨着Cross Apply

SELECT ID,FN_RS.VALUE FROM @TAB 
CROSS APPLY 
(SELECT * FROM [DBO].[FN_SPLIT_STR_TO_COL] (NAME)) AS FN_RS 
+0

您的查詢是好的,但我正在尋找一個功能。你能幫我嗎? –

+0

你可以檢查我的答案,將滿足你的條件... @Pravesh.Kan – Chanukya

+0

我已經添加了代碼功能@Pravesh.Kan –

0
create function [dbo].[udf_splitstring] (@tokens varchar(max), 
             @delimiter varchar(5)) 
returns @split table (
    token varchar(200) not null) 
as 
    begin 
     declare @list xml 

     select @list = cast('<a>' 
          + replace(@tokens, @delimiter, '</a><a>') 
          + '</a>' as xml) 

     insert into @split 
        (token) 
     select ltrim(t.value('.', 'varchar(200)')) as data 
     from @list.nodes('/a') as x(t) 

     return 
    end 


    create table #dup 
(id int, name varchar(100) 
) 
insert into #dup values 
(1,'leela,venkatesh,don'), 
(2,'john,smith,lewis') 

select id,b.token from #dup 
cross apply 
(select token from udf_splitstring(name,','))b 
相關問題