解析并将XML导入SQL Server中的表格

问题描述:

我已经编写了一个将表格数据导出到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

我不太清楚你想要什么,因为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