2012-04-11 51 views
0

我有一个表:要拆分在SQL Server列2008

servername description                 ObjectState 
VM1 SP LA - W IN S V R S #P19 99 9999 999999 999 QTY 1      0 
VM2 S PL A - V R STD #P29-9 9 99 QTY 2 : SPLVRENT #P3 999999 9 QTY 3 1 
VM3 S PL A - WI NS V R S TD #P39-9 999 QTY 3 0 
VM4 SPLA - WI NS V R STD #P59- 9 9 99 QTY 2 : S P LA - W IN SV RENT #P39-9999 QTY 3 :  SPL A - WIN S VR SMB # P 3 9- 999 99 QTY 5 1 
VM6 SPLA - W I NS VRSQ LSE R VE RS TD #P 6 9-9 9 9 9 QTY 6 0 
VM5 SPLA - W IN S VRS TD #P59-9999 QTY 5 : SPLA - SQLSERVER-08 #P59-9999 QTY 5 0 
VM7 SPLA - W I NSV R ST D #P79-9999 QTY 6 0 
VM8 SPLA - W INS VR STD #P8 9-9 9 99 QTY 1 1 

我写这样的查询

分裂说明列像

SELECT 
    T.servername, 
    A.x.value('(/e/text())[1]', 'varchar(MAX)') [description], 
    A.x.value('(/e/text())[2]', 'varchar(25)') [ponumber], 
    A.x.value('(/e/text())[3]', 'varchar(2)') [qty], 
    A.x.value('(/e/text())[4]', 'char(1)') [ObjectState] 
FROM 
    T1 AS T 
    CROSS APPLY 
    (SELECT T.[description] AS [text()] FOR XML PATH('')) AS R(s) 
    CROSS APPLY 
    (SELECT T.[ObjectState] as [text()] FOR XML PATH('')) AS B(t) 
    CROSS APPLY 
    (SELECT CAST('<e>' + REPLACE(R.s,':', '</e><e>') + '</e>' AS xml)) AS S(x) 
    CROSS APPLY 
    S.x.nodes('/e') AS N1(e) 
    CROSS APPLY 
    (SELECT CAST('<e>' + REPLACE(REPLACE(N1.e.value('text()[1]','varchar(MAX)'), '#', '</e><e>'), 'QTY', '</e><e>') + '</e>' AS xml)) AS A(x) 

和我得到的输出像这样

servername description   ponumber     qty  ObjectStat    
VM1 SP LA - W IN S V R S P19 99 9999 999999 999 1  NULL 
VM2 S PL A - V R STD P29-9 9 99   2                NULL 
VM2 SPLVRENT   P3 999999 9   3                NULL 

I想要输出在Colum对象状态中为

vm1 SP LA - W IN S V R S P19 99 9999 999999 999 1 0 
vm2 S PL A - V R STD  P29-9 9 99    2 1 
vm2 SPLVRENT    P3 999999 9   3 1 

像这样 - 我将如何修改上述代码以获取我需要的输出?

+0

我试图标记你的代码和结果样本,但区分列内容有点棘手。 – 2012-04-11 09:40:53

+0

同意@Damien_The_Unbeliever,如果您可以重新格式化您的表格视图以使用竖线或类似的东西来分隔列,将会有所帮助。 – 2012-04-11 14:39:05

回答

0

在您的查询中,它看起来像ObjectState是它自己的一个字段。所以...

SELECT 
    T.servername, 
    A.x.value('(/e/text())[1]', 'varchar(MAX)') [description], 
    A.x.value('(/e/text())[2]', 'varchar(25)') [ponumber], 
    A.x.value('(/e/text())[3]', 'varchar(2)') [qty], 
    T.ObjectState 
FROM 
    @T AS T 
    CROSS APPLY 
    (SELECT T.[description] AS [text()] FOR XML PATH('')) AS R(s) 
    CROSS APPLY 
    (SELECT CAST('<e>' + REPLACE(R.s,':', '</e><e>') + '</e>' AS xml)) AS S(x) 
    CROSS APPLY 
    S.x.nodes('/e') AS N1(e) 
    CROSS APPLY 
    (SELECT CAST('<e>' + REPLACE(REPLACE(N1.e.value('text()[1]','varchar(MAX)'), '#', '</e><e>'), 'QTY', '</e><e>') + '</e>' AS xml)) AS A(x)