2009-11-29 67 views
3

我已經編寫了一個將表格數據導出到XML文件的CLR程序集。現在我想將這些數據導入另一個實例的臨時表中。 XML文件的結構是這樣的:解析並將XML導入SQL Server中的表格

<row> 
    <SystemInformationID>1</SystemInformationID> 
    <Database_x0020_Version>10.00.80404.00</Database_x0020_Version> 
    <VersionDate>2008-04-04T00:00:00</VersionDate> 
    <ModifiedDate>2008-04-04T00:00:00</ModifiedDate> 
</row> 

我想要的XML到目標位置被解析並導入到一個臨時表。我也有主表,所以我可以從那裏得到表結構。 有沒有辦法?我使用OPENXML,但它似乎沒有正常工作。我可以將XML文件讀取到一個表中,該表將存儲在具有XML數據類型的列中。我的問題是解析該列中的數據。 這是一個臨時的嘗試:

CREATE TABLE ##T (IntCol int, XmlCol xml) 
GO 

INSERT INTO ##T(XmlCol) 
SELECT * FROM OPENROWSET(
    BULK 'c:\HISOutput.xml', 
    SINGLE_CLOB) AS x 
--works correctly up to this point 

DECLARE @x xml 
DECLARE @id int 
SELECT @x=XmlCol FROM ##T 

EXEC sp_xml_preparedocument @id OUTPUT, @x 

SELECT * 
FROM  OPENXML (@id,'/row',2) 
WITH 
dbo.awbuildversion 

--I used dbo.awbuildversion table from AdventureWorks DB for testing 
this doesn't show the first column no matter how I change the OPENXML instruction. 

TX提前

+0

如果不縮進的xml至少4位的SO軟件吃<和>字符。我爲你修好了。 – 2009-11-29 05:52:32

+0

tx Jim,不知道 – Saba 2009-11-29 07:45:25

+0

或只是簡單地突出顯示您的代碼行,然後按下編輯器工具欄上的「代碼」按鈕(101 010)以獲得有關OPENXML的建議的「代碼格式」右邊的 – 2009-11-29 08:35:41

回答

3

我不太清楚你想要什麼,因爲OMG小馬的回答您的評論是你的問題不同。臨時表/表結構有什麼問題?

無論如何,我不會在SQL Server 2050及更高版本上使用OPENXMLsp_xml_preparedocument(因爲您提到過CLR,因此我假定這是因爲內存泄漏風險)。

另外,如果你需要的表stucture那麼你可以使用INTO #tempTable

DECLARE @foo xml 

SET @foo = '<row> 
    <SystemInformationID>1</SystemInformationID> 
    <Database_x0020_Version>10.00.80404.00</Database_x0020_Version> 
    <VersionDate>2008-04-04T00:00:00</VersionDate> 
    <ModifiedDate>2008-04-04T00:00:00</ModifiedDate> 
</row>' 

SELECT 
    bar.value('./SystemInformationID[1]','INT') AS 'SystemInformationID', 
    bar.value('./Database_x0020_Version[1]','VARCHAR(14)') AS 'Database_x0020_Version', 
    bar.value('./VersionDate[1]','DATETIME') AS 'VersionDate', 
    bar.value('./ModifiedDate[1]','DATETIME') AS 'ModifiedDate' 
INTO #tempTable -- This? 
FROM 
    @foo.nodes('/row') AS foo(bar)  --use nodes not OPENXML 
+1

tx sp_xml_preparedocument中。 我會牢記這一點。我的問題在select子句中。我想把腳本交給我們的開發人員,他會爲不同數據庫中的不同表格運行它。如果我必須在每個表的select命令中寫入整個表結構,那將是無效的。我想爲每個表生成一個模板XML文件(如果可能的話),或者使用目標站點中的現有表結構(我們在每個站點中都有相同的結構的數據庫) – Saba 2009-12-02 17:35:32

+0

@Saba:我可以在XML模式在選擇它時調整數據的形狀。我自己沒有用過。但是,SQL是強烈定義和鍵入的,並且在不同情況下使相同的xml/query返回不同的列是沒有意義的。除非每個目標表有不同的xml – gbn 2009-12-02 19:42:12

+0

@gbn:我不是說相同的查詢返回不同的結果。我的意思是相同的查詢針對具有不同結構的不同表運行,並且我不想在每次針對不同表運行查詢時鍵入表結構。我想爲每個表使用它自己的結構,或者爲該表特定的生成的xml模式。 – Saba 2009-12-06 07:52:41