2012-01-23 18 views
0

我有一個問題。我有一個SQL Server表,它將一堆XML文檔存儲在一列中。我需要將這些XML文檔傳遞給XML解析器,但我的起始XML格式不是解析器可以接受的格式。這是我必須工作與 -如何將SQL Server表中的XML從一種格式寫入另一種格式?

存儲在我的SQL Server表XML是按以下格式:

<Document ID="207"> 
    <Version>1.0</Version> 
    <LastModifiedInVersion>1.0</LastModifiedInVersion> 
    <Signatures /> 
    <Controls> 
    <Control ID="EmpID"> 
     <Value>45678</Value> 
    </Control> 
    <Control ID="EmpFN"> 
     <Value>Ryn</Value> 
    </Control> 
    <Control ID="EmpLN"> 
     <Value>Veris</Value> 
    </Control> 
    <Control ID="EmpDOB"> 
     <Value>01/19/1980</Value> 
    </Control> 
    </Controls> 
    <AutoKeys /> 
</Document> 

我需要的是XML,使它看起來像這樣:

<xml_record> 
<employee> 
    <EmpID value="45678"/> 
    <EmpFN value="Ryn"/> 
    <EmpLN value="Veris"/> 
    <empDOB value="01/19/1980"/> 
</employee> 
</xml_record> 

我看着使用XSLT,但它似乎都是基於在瀏覽器中顯示XML數據,而不是實際格式的翻譯。我的最終目標僅僅是轉換格式並使用XML解析器來拉取員工值來填充另一個表格,而不需要原始XML的其餘部分。我期望甚至有可能做什麼?如果是這樣的話,只要指出我的方向是正確的。

+0

不知道這樣的庫是否存在MS環境,但這聽起來像是一個XQuery任務 – BigMike

+0

試試看這裏,似乎SQL Server有一些XQuery支持。 http://www.codeguru.com/csharp/.net/net_data/article.php/c19491/SQL-Server-2005-XQuery-and-XML-DML---Part-1.htm。 – BigMike

回答

1

試試這個:

DECLARE @xdoc xml = '<Document ID="207"> 
    <Version>1.0</Version> 
    <LastModifiedInVersion>1.0</LastModifiedInVersion> 
    <Signatures /> 
    <Controls> 
    <Control ID="EmpID"> 
     <Value>45678</Value> 
    </Control> 
    <Control ID="EmpFN"> 
     <Value>Ryn</Value> 
    </Control> 
    <Control ID="EmpLN"> 
     <Value>Veris</Value> 
    </Control> 
    <Control ID="EmpDOB"> 
     <Value>01/19/1980</Value> 
    </Control> 
    </Controls> 
    <AutoKeys /> 
</Document> 
' 


SELECT 
    EmpID 'EmpID/@value', 
    EmpFN 'EmpFN/@value', 
    EmpLN 'EmpLN/@value', 
    EmpDOB 'EmpDOB/@value' 
FROM (
SELECT 
    @xdoc.query('//Control[@ID = "EmpID"]/Value').value('.','INT') AS EmpID, 
    @xdoc.query('//Control[@ID = "EmpFN"]/Value').value('.','VARCHAR(100)') AS EmpFN, 
    @xdoc.query('//Control[@ID = "EmpLN"]/Value').value('.','VARCHAR(100)') AS EmpLN, 
    @xdoc.query('//Control[@ID = "EmpDOB"]/Value').value('.','VARCHAR(100)') AS EmpDOB 
)t 
FOR XML PATH('employee'), ROOT('xml_record') 

不是最優雅,但工作。

+0

哇,我將不得不放棄一槍!我會告訴你它是如何工作的,非常感謝你的意見! – Xedicon

相關問題