如何以特定的方式从sql server中提取xml数据

时间:2014-09-07 08:45:44

标签: sql-server xml

这是我的样本xml

<NewDataSet> 
<Employee>
<EmpID>1005</EmpID>
<Name> keith </Name>
<DOB>12/02/1981</DOB>
<Salary>10,500</Salary>
</Employee>
</NewDataSet>

从那里我想提取数据并以这种方式存储在字符串变量中

SET @Data='EmpID=1005,Name='Keith',DOB='12/02/1981',Salary=10,500'

所以告诉我从xml中提取数据的方法,并按照我想要的方式重新排列或存储字符串变量中的数据,但请给我建议的sql,这应该适用于不同的或任何xml模板。寻找想法。感谢

2 个答案:

答案 0 :(得分:1)

DECLARE @xmlVar AS XML
DECLARE @vcRow AS VARCHAR(500)
SET @xmlVar ='<NewDataSet> 
<Employee>
<EmpID>1005</EmpID>
<Name> keith </Name>
<DOB>12/02/1981</DOB>
<Salary>10,500</Salary>
</Employee>
</NewDataSet>'

;with yourDataSet
AS (
SELECT
    t.u.value('EmpID[1]','INT') AS EmpID
    ,t.u.value('Name[1]','VARCHAR(50)') AS Name
    ,t.u.value('DOB[1]','DATE') AS DOB
    ,t.u.value('Salary[1]','MONEY') AS Salary

FROM
    @xmlVar.nodes('/NewDataSet/Employee') AS t(u) )


SELECT
    /*@vcRow = */'EmpID='+ CAST(EmpID AS VARCHAR(50)) +',' +
        'Name='''+Name +''',DOB=''' + CONVERT(VARCHAR(10),DOB,110) + ''',Salary='+CAST(Salary AS VARCHAR(50))   
FROM
    yourDataSet

答案 1 :(得分:1)

这样的事情会起作用。该查询提取所有Employee子节点并连接到字符串。该脚本仅在@tbl中只有一行时才有效,但它只是说明了获取所需字符串的方法。它也不是通用的,我想象的要困难得多。

DECLARE @tbl TABLE(data XML NOT NULL);
INSERT INTO @tbl(data)VALUES('<NewDataSet> 
<Employee>
<EmpID>1005</EmpID>
<Name> keith </Name>
<DOB>12/02/1981</DOB>
<Salary>10,500</Salary>
</Employee>
</NewDataSet>');

DECLARE @data VARCHAR(4000);

SELECT
    @data = 
        'EmpID=' + N.T.value('EmpID[1]','VARCHAR(512)') + ',' +
        'Name=''' + N.T.value('Name[1]','VARCHAR(512)') + ''',' +
        'DOB=''' + N.T.value('DOB[1]','VARCHAR(512)') + ''',' +
        'Salary=' + N.T.value('Salary[1]','VARCHAR(512)') 
FROM
    @tbl AS t
    CROSS APPLY t.data.nodes('//Employee') AS N(T)

PRINT @data;