分割字符串然后旋转结果

Phi*_*ray 3 sql t-sql sql-server parsing sql-server-2005

如果有一个从 .Net 应用程序传递的字符串,如下所示

2023|F66451,1684|648521,1684|600271,2137|019592
Run Code Online (Sandbox Code Playgroud)

我已开始使用下面的方法解析字符串,但我需要透视从 Split (用 * 包围)函数返回的数据,以便插入到 #tmpExceptions 表中

DECLARE @ExceptionsList as nvarchar(MAX)

SET @ExceptionsList = '2023|F66451,1684|648521,1684|600271,2137|019592'

SET NOCOUNT ON;

DECLARE @CurrentLineItem as nvarchar(255)

CREATE TABLE #ParsePassOne
(
    LineItem nvarchar(255)
)

CREATE TABLE #tmpExceptions
(
    AccountNumber int,
    ClaimNumber nvarchar(50)
)

INSERT INTO #ParsePassOne
    SELECT value FROM Split( ',' ,@ExceptionsList)

WHILE EXISTS(SELECT LineItem FROM #ParsePassOne)
    BEGIN
        SELECT TOP 1 @CurrentLineItem = LineItem FROM #ParsePassOne

        *******
            SELECT value FROM Split( '|' ,@CurrentLineItem) 
            *******

        DELETE FROM #ParsePassOne WHERE LineItem = @CurrentLineItem
    END

SELECT * FROM #tmpExceptions

DROP TABLE #ParsePassOne
DROP TABLE #tmpExceptions
Run Code Online (Sandbox Code Playgroud)

到目前为止,返回的数据如下所示。我只需要将数据旋转到列,以便可以插入它。我该怎么办?

在此输入图像描述

分割功能

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--Creates an 'InLine' Table Valued Function (TVF)
ALTER FUNCTION [dbo].[Split] 
   (  @Delimiter varchar(5), 
      @List      varchar(8000)
   ) 
   RETURNS @TableOfValues table 
      (  RowID   smallint IDENTITY(1,1), 
         [Value] varchar(50) 
      ) 
AS 
   BEGIN

      DECLARE @LenString int 

      WHILE len( @List ) > 0 
         BEGIN 

            SELECT @LenString = 
               (CASE charindex( @Delimiter, @List ) 
                   WHEN 0 THEN len( @List ) 
                   ELSE ( charindex( @Delimiter, @List ) -1 )
                END
               ) 

            INSERT INTO @TableOfValues 
               SELECT substring( @List, 1, @LenString )

            SELECT @List = 
               (CASE ( len( @List ) - @LenString ) 
                   WHEN 0 THEN '' 
                   ELSE right( @List, len( @List ) - @LenString - 1 ) 
                END
               ) 
         END

      RETURN 

   END 
Run Code Online (Sandbox Code Playgroud)

Kan*_*amy 5

如果您使用的是 SQL Server 2016,您可以使用 String_Split() 函数并使用交叉应用/透视来进入单行

create table #t (v varchar(50), i int)
insert into #t (v, i) values ('2023|F66451',1)
,('1684|648521',2), ('1684|600271', 3), ('2137|019592', 4)

--Inorder to get into same row -pivoting the data
select * from (
select * from #t t cross apply (select RowN=Row_Number() over (Order by (SELECT NULL)), value from string_split(t.v, '|') ) d) src
pivot (max(value) for src.RowN in([1],[2])) p
Run Code Online (Sandbox Code Playgroud)