【问题标题】:Parse and Import XML into Table in SQL Server解析 XML 并将其导入 SQL Server 中的表
【发布时间】:2009-11-29 05:41:45
【问题描述】:

我编写了一个将表数据导出到 XML 文件的 CLR 程序集。现在我想将此数据导入另一个实例的临时表中。 XML文件结构如下:

<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.

提前发送

【问题讨论】:

  • 如果你不缩进你的 xml 至少 4 个空格,那么 SO 软件会吃掉 <和>人物。我帮你修好了。
  • tx Jim,不知道
  • 或者只是简单地突出显示您的代码行,然后按编辑器工具栏上的“代码”按钮 (101 010) 以获取正确的“代码格式”

标签: sql sql-server xml


【解决方案1】:

我不太确定您想要什么,因为您对 OMG Ponies 答案的评论与您的​​问题不同。临时表/表结构有什么问题?

无论如何,由于内存泄漏的风险,我不会在 SQL Server 2050 及更高版本(我假设你有它,因为你提到 CLR)上使用 OPENXMLsp_xml_preparedocument

另外,如果您需要表格结构,那么您可以使用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

【讨论】:

  • tx 获取有关 OPENXML 和 sp_xml_preparedocument 的建议。我会记住这一点。我的问题在 select 子句中。我想将脚本交给我们的开发人员,他将为不同数据库中的不同表运行它。如果我必须在我的 select 命令中为每个表编写整个表结构,那将是无效的。我想为每个表生成一个模板 XML 文件(如果可能),或者使用目标站点中的现有表结构(我们在每个站点中都有数据库,具有相同的结构)
  • @Saba:我可以在 xml 模式中提出所有建议,以便在您选择数据时对其进行整形。那时我自己没用过。但是,SQL 是强定义和类型化的,让相同的 xml/查询在不同的情况下返回不同的列是没有意义的。除非每个目标表有不同的 xml
  • @gbn:我不是说同一个查询返回不同的结果。我的意思是对具有不同结构的不同表运行相同的查询,并且我不想每次为不同的表运行查询时都键入表结构。对于每个表,我想使用它自己的结构或生成的特定于该表的 xml 模式。
  • this answer 中有一个关于如何创建和重用模式的好例子。
猜你喜欢
  • 2018-05-06
  • 1970-01-01
  • 2013-05-26
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
相关资源
最近更新 更多