如果你只是想分開,並交換數量和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
+1的開裂空間分成不同的列。我不確定這是否是要求。我在第一次拆分後交換了「數量」和「X」。結賬礦。 – Kaf
謝謝我只是試過這個,忘了我有一些在該領域不遵守指示格式的舊歷史數據..道歉,所以我打一個XML解析:第1行,字符54,非法名稱字符。如果格式不正確,是否有辦法返回原始字段?否則這看起來正是我所需要的 – user552769
我隔離了一個有效的數據集,它的工作欄上的數字列是空白的,因此所有列都向右移動。 Vals.a.value('(/ H/r)[1]','VARCHAR(100)')AS數量, – user552769