簡體   English   中英

將XML導入SQL表並格式化數據

[英]Import XML to SQL table and format data

有人可以幫助我,我正在嘗試將xml文件導入sql服務器表。 我可以導入所需的數據,但是在以所需的格式獲取數據時遇到了一些麻煩。

    declare @input XML = '<Sub>
    <Results>
    <Result>
      <ids>
        <id>
          <type>code</type>
          <value>9004a3d2</value>
        </id>
        <id>
          <type>username</type>
          <value>jbloggs001</value>
          <date>20160725</date>
        </id>
        <id>
         <type>EmployeeID</type>
         <value>01234</value>
         <date>20160725</date>
        </id>
     </ids>
    </Result>
</Results>
</Sub>'
   SELECT
     datatype = XCol.value('(type)[1]','varchar(25)'),
    datavalue = XCol.value('(value)[1]','varchar(50)')
   FROM 
      @input.nodes('/Sub/Results/Result/ids/id') AS XTbl(XCol)

這給出了3列,例如:

datatype       datavalue
--------------------------------
   code        9004a3d2   
   username    jbloggs001
   employeeID  01234

可以將其導入為嗎?

EmployeeID   USername     Code
    ---------------------------------
   01234        jbloggs    0019004a3d2

謝謝

正如使用PIVOT可以完成的注釋中所建議的那樣:

   SELECT *
   FROM (
   SELECT
     datatype = XCol.value('(type)[1]','varchar(25)'),
    datavalue = XCol.value('(value)[1]','varchar(50)')
   FROM 
      @input.nodes('/Sub/Results/Result/ids/id') AS XTbl(XCol)
    ) as p
    PIVOT (
        MAX(datavalue) FOR datatype IN (EmployeeID,username,code)
    ) as pvt

輸出:

EmployeeID  username    code
01234       jbloggs001  9004a3d2

如果輸入始終是相同type s:

SELECT  XCol.value('(id/value)[3]','varchar(50)') as EmployeeID,
        XCol.value('(id/value)[2]','varchar(50)') as username,
        XCol.value('(id/value)[1]','varchar(50)') as code
FROM @input.nodes('/Sub/Results/Result/ids') AS XTbl(XCol)

以下查詢適用於您的解決方案

Select [EmployeeID],[Username],[Code]
FROM #TEMP
PIVOT
(
MAX(DATAVALUE) FOR DATATYPE IN (code,username,employeeID)
)A

另一個選擇是XQuery包含功能

declare @input XML = '<Sub>
    <Results>
    <Result>
      <ids>
        <id>
          <type>code</type>
          <value>9004a3d2</value>
        </id>
        <id>
          <type>username</type>
          <value>jbloggs001</value>
          <date>20160725</date>
        </id>
        <id>
         <type>EmployeeID</type>
         <value>01234</value>
         <date>20160725</date>
        </id>
     </ids>
    </Result>
</Results>
</Sub>';
   SELECT
    code = XCol.value('(id[contains((./type)[1],"code")]/value)[1]','varchar(50)'),
    username = XCol.value('(id[contains((./type)[1],"username")]/value)[1]','varchar(50)'),
    EmployeeID = XCol.value('(id[contains((./type)[1],"EmployeeID")]/value)[1]','varchar(50)')

   FROM 
      @input.nodes('/Sub/Results/Result/ids') AS XTbl(XCol);

另一個非常直接且類型安全的方法是:

SELECT id.value('(id[type="code"]/value)[1]','varchar(max)') AS code
      ,id.value('(id[type="username"]/value)[1]','varchar(max)') AS username
      ,id.value('(id[type="EmployeeID"]/value)[1]','varchar(max)') AS EmployeeID
FROM @input.nodes('Sub/Results/Result/ids') AS A(id)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM