将SQL列中的分隔值拆分为使用多个分隔符的多行

将SQL列中的分隔值拆分为使用多个分隔符的多行,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我正在寻找一些帮助,来拆分在sql函数/语句中使用多个分隔符的字段。我已经列举了几个例子 在这里,使用单个分隔符可以很好地工作。但是,我需要拆分一个基于以下内容的字段。它的格式将是qty x itemno description、qty x itemno description等。因此,我需要将第一个“x”第二个空格“”和最后一个逗号上的语句分开。。我想我可以基于正则表达式语句拆分它,但不确定如何进行 有人能帮忙吗 OnSameLine = substring( ( SELECT ',

我正在寻找一些帮助,来拆分在sql函数/语句中使用多个分隔符的字段。我已经列举了几个例子

在这里,使用单个分隔符可以很好地工作。但是,我需要拆分一个基于以下内容的字段。它的格式将是qty x itemno description、qty x itemno description等。因此,我需要将第一个“x”第二个空格“”和最后一个逗号上的语句分开。。我想我可以基于正则表达式语句拆分它,但不确定如何进行

有人能帮忙吗

    OnSameLine = substring( ( SELECT ', ' + 
                 coalesce (CAST(CNT.qty AS varchar(1000)), '') +                  
                 ' x ' + '['+ coalesce (CNT.Itemno,'') + ']' + 
                 ' ' + coalesce (STK.Desc#1,'')
我需要的格式

PK qty itemno description
PK qty itemno description 
等等

试试这个:

根据来自

如果你只想按分割,交换数量和主键,试试这个

如果要将它们拆分为列,请尝试此操作


+1用于按空格拆分为不同的列。我不确定这是否符合要求。我在第一次拆分后交换了数量和X。签出我的。谢谢。我刚刚尝试了这个,但忘记了我在字段中有一些不符合指示格式的旧历史数据。。抱歉,所以我点击了一个XML解析:第1行,字符54,非法名称字符。如果格式不正确,是否有方法返回原始字段。否则这看起来正是我所需要的我隔离了一个有效的数据集,它的工作条数量列是空的,因此所有列都向右移动一。我想是这条线造成了这个错误。。VAL.a.值'/H/r[1]',VARCHAR100'作为数量,
;with T(id, Cols) as
(
  select 1, '10 x 1234 description1,11 x 456 description2' 
  UNION ALL
  select 2, '40 x 123478 description3,51 x 45678 description4' 
),
--first split all comma separated into different rows
CTE2 AS 
(
    SELECT id, 
    CAST(N'<H><r>' + replace(Replace(Vals.a.value('.', 'NVARCHAR(50)'),
        ' ','|'), '|', '</r><r>') + '</r></H>' as XML) Cols
    FROM
    (
    SELECT *,CAST (N'<H><r>' + Replace(cols,',','</r><r>') + 
        '</r></H>' AS XML) AS [vals]
    FROM T) d
    CROSS APPLY d.[vals].nodes('/H/r') Vals(a)
)
-- split all ' ' demilited values now
SELECT distinct id, Vals.a.value('(/H/r)[1]', 'VARCHAR(100)') AS Qty,
Vals.a.value('(/H/r)[2]', 'VARCHAR(100)') AS X,
Vals.a.value('(/H/r)[3]', 'VARCHAR(100)') AS ItemNo,
Vals.a.value('(/H/r)[4]', 'VARCHAR(100)') AS Description
FROM
(
SELECT *
FROM CTE2) d
CROSS APPLY d.[cols].nodes('/H/r') Vals(a)
DECLARE @S VARCHAR(max)= 'Q1 PK1 ITM1 D1,Q2 PK2 ITM2 D2'

DECLARE @X XML
SELECT @X  = '<myxml><n><d>' + 
             REPLACE (@S,',','</d></n><n><d>') + '</d></n></myxml>'


SELECT SUBSTRING(x,firstSpace,secondSpace-firstSpace) + ' ' + 
       SUBSTRING(x,1,firstSpace) + ' ' + 
       SUBSTRING(x,secondSpace,len(x))
FROM ( --Getting CharIndex of first and second spaces
    SELECT x, CHARINDEX(' ',x,1) firstSpace, CHARINDEX(' ',x,CHARINDEX(' ',x,1)+1) secondSpace
    FROM ( --Spliting by "," into records 
        SELECT C.value('d[1]','VARCHAR(50)') x
        FROM @X.nodes('/myxml/n') Cols (C) ) T1
) T2
--Data
'Q1 PK1 ITM1 D1,Q2 PK2 ITM2 D2'

--Results
'PK1 Q1 ITM1 D1'
'PK2 Q2 ITM2 D2'
DECLARE @S VARCHAR(500)= 'Q1 PK1 ITM1 D1,Q2 PK2 ITM2 D2'
DECLARE @X XML

SELECT @X  = '<myxml><n><d>' + 
REPLACE(REPLACE (@S,',','</d></n><n><d>'), ' ', '</d><d>') + 
'</d></n></myxml>'


SELECT  C.value('d[2]','VARCHAR(50)') PK,
        C.value('d[1]','VARCHAR(50)') Qty,
        C.value('d[3]','VARCHAR(50)') Item,
        C.value('d[4]','VARCHAR(50)') Description
        FROM @X.nodes('/myxml/n') Cols (C)
--Data 
'Q1 PK1 ITM1 D1,Q2 PK2 ITM2 D2'

--Results
PK1 | Q1 | ITM1 | D1
PK2 | Q2 | ITM2 | D2