2016-11-10 2 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

после размещения вопросов u должен проверить ответы, и он удовлетворяет вашему требованию, и вы должны принять .. @ pravesh.kan – Chanukya

ответ

0

TRY Этот запрос

//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 

Edit: Из ваших Комментарии

Если вы хотите сделать выше с функцией, этот намного легче, чем выше зацикливание.

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 
Смежные вопросы