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