Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将SQL中的行分隔为不同的列,用破折号(-)和管道(|)分隔_Sql Server - Fatal编程技术网

Sql server 将SQL中的行分隔为不同的列,用破折号(-)和管道(|)分隔

Sql server 将SQL中的行分隔为不同的列,用破折号(-)和管道(|)分隔,sql-server,Sql Server,因此,我尝试将一些数据从管道分隔行拆分为不同的列,这是一行: 我有一个适用于它的函数,如下所示: CREATE FUNCTION dbo.TestPipeSplit ( @multiwordstring VARCHAR(255), @wordnumber NUMERIC ) returns VARCHAR(255) AS BEGIN DECLARE @remainingstring VARCHAR(255) SET @remainingstring=@multi

因此,我尝试将一些数据从管道分隔行拆分为不同的列,这是一行:

我有一个适用于它的函数,如下所示:

CREATE FUNCTION dbo.TestPipeSplit
(
  @multiwordstring VARCHAR(255),
  @wordnumber      NUMERIC
)
returns VARCHAR(255)
AS

  BEGIN
  DECLARE @remainingstring VARCHAR(255)
  SET @remainingstring=@multiwordstring

  DECLARE @numberofwords NUMERIC
  SET @numberofwords=(LEN(@remainingstring) - LEN(REPLACE(@remainingstring, '|', '')) + 1)

  DECLARE @word VARCHAR(50)
  DECLARE @parsedwords TABLE
  (
     line NUMERIC IDENTITY(1, 1),
     word VARCHAR(255)
  )

  WHILE @numberofwords > 1
    BEGIN
        SET @word=LEFT(@remainingstring, CHARINDEX('|', @remainingstring) - 1)

        INSERT INTO @parsedwords(word)
        SELECT @word

        SET @remainingstring= REPLACE(@remainingstring, Concat(@word, '|'), '')
        SET @numberofwords=(LEN(@remainingstring) - LEN(REPLACE(@remainingstring, '|', '')) + 1)

        IF @numberofwords = 1
          BREAK

        ELSE
          CONTINUE
    END
正如您在屏幕截图上看到的,有一个黄色的突出显示,我需要能够通过破折号分隔这些行。 因此,我使用的工具将数据导入SQL,每个以破折号分隔的项都是一段用户信息,我需要能够分隔每个用户(破折号),然后将以管道分隔的信息段分隔到不同的列中。我能做第二部分,但我被破折号卡住了。 我尝试将相同的函数应用于破折号的管道,但我让脚本运行了一个多小时,什么也没有出现


谢谢你

下面是一个使用少量XML的方法

这也假设您已经知道或最大位置数。否则,您将需要动态

此外,张贴图像也没有帮助

示例

Declare @YourTable table (ID int,SomeCol varchar(max))
Insert Into @YourTable values
 (1,'123|abc|456')
,(2,'789|def|012')

Select A.ID
     ,B.*
 From @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                      ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
                      ,Pos8 = ltrim(rtrim(xDim.value('/x[8]','varchar(max)')))
                      ,Pos9 = ltrim(rtrim(xDim.value('/x[9]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(SomeCol,'|','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

如果您更愿意将其作为TVF,请查看

搜索用于拆分字符串列表的内联表值函数。在线上有数百个。你真的应该用一个快速的脚本在某种应用层中解析它,制作出一些干净的,甚至是CSV的,适合导入的东西。
ID  Pos1    Pos2    Pos3    Pos4    Pos5    Pos6    Pos7    Pos8    Pos9
1   123     abc     456     NULL    NULL    NULL    NULL    NULL    NULL
2   789     def     012     NULL    NULL    NULL    NULL    NULL    NULL