2012-12-17 121 views
0

我正在尋找一些幫助來拆分在SQL函數/語句中使用多個分隔符的字段。我已經按照已經列出的幾個例子HERE將SQL列中的分隔值拆分爲多個使用多個分隔符的行

這裏的工作很好,單個分隔符。不過,我需要拆分一個基於以下內容的字段。它的格式將是數量x的itemno描述,數量x的itemno描述等。因此,我需要分開第一個'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

試試這個:

基於本文從here

;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) 
+0

+1的開裂空間分成不同的列。我不確定這是否是要求。我在第一次拆分後交換了「數量」和「X」。結賬礦。 – Kaf

+0

謝謝我只是試過這個,忘了我有一些在該領域不遵守指示格式的舊歷史數據..道歉,所以我打一個XML解析:第1行,字符54,非法名稱字符。如果格式不正確,是否有辦法返回原始字段?否則這看起來正是我所需要的 – user552769

+0

我隔離了一個有效的數據集,它的工作欄上的數字列是空白的,因此所有列都向右移動。 Vals.a.value('(/ H/r)[1]','VARCHAR(100)')AS數量, – user552769

0

如果你只是想分開,並交換數量和PK,試試這個;

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 

SQL Fiddle here

--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) 

SQL Fiddle here

--Data 
'Q1 PK1 ITM1 D1,Q2 PK2 ITM2 D2' 

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