How to split a comma-separated value to columns

后端 未结 30 3945
刺人心
刺人心 2020-11-21 04:38

I have a table like this

Value   String
-------------------
1       Cleo, Smith

I want to separate the comma delimited string into two colu

30条回答
  •  野性不改
    2020-11-21 04:45

    You may find the solution in SQL User Defined Function to Parse a Delimited String helpful (from The Code Project).

    This is the code part from this page:

    CREATE FUNCTION [fn_ParseText2Table]
      (@p_SourceText VARCHAR(MAX)
      ,@p_Delimeter VARCHAR(100)=',' --default to comma delimited.
      )
     RETURNS @retTable
      TABLE([Position] INT IDENTITY(1,1)
       ,[Int_Value] INT
       ,[Num_Value] NUMERIC(18,3)
       ,[Txt_Value] VARCHAR(MAX)
       ,[Date_value] DATETIME
       )
    AS
    /*
    ********************************************************************************
    Purpose: Parse values from a delimited string
      & return the result as an indexed table
    Copyright 1996, 1997, 2000, 2003 Clayton Groom (Clayton_Groom@hotmail.com)
    Posted to the public domain Aug, 2004
    2003-06-17 Rewritten as SQL 2000 function.
     Reworked to allow for delimiters > 1 character in length
     and to convert Text values to numbers
    2016-04-05 Added logic for date values based on "new" ISDATE() function, Updated to use XML approach, which is more efficient.
    ********************************************************************************
    */
    
    
    BEGIN
     DECLARE @w_xml xml;
     SET @w_xml = N'' + replace(@p_SourceText, @p_Delimeter,'') + '';
    
    
     INSERT INTO @retTable
         ([Int_Value]
        , [Num_Value]
        , [Txt_Value]
        , [Date_value]
         )
         SELECT CASE
           WHEN ISNUMERIC([i].value('.', 'VARCHAR(MAX)')) = 1
           THEN CAST(CAST([i].value('.', 'VARCHAR(MAX)') AS NUMERIC) AS INT)
          END AS [Int_Value]
        , CASE
           WHEN ISNUMERIC([i].value('.', 'VARCHAR(MAX)')) = 1
           THEN CAST([i].value('.', 'VARCHAR(MAX)') AS NUMERIC(18, 3))
          END AS [Num_Value]
        , [i].value('.', 'VARCHAR(MAX)') AS [txt_Value]
        , CASE
           WHEN ISDATE([i].value('.', 'VARCHAR(MAX)')) = 1
           THEN CAST([i].value('.', 'VARCHAR(MAX)') AS DATETIME)
          END AS [Num_Value]
         FROM @w_xml.nodes('//root/i') AS [Items]([i]);
     RETURN;
    END;
    GO
    

提交回复
热议问题