【发布时间】:2017-06-28 21:54:04
【问题描述】:
我正在寻找将表(或其中的一部分)导出到 xml 文件,然后将此 xml 文件导入到其他数据库中的相应表中的最简单方法。
我发现的原理很简单:
-
导出:在源数据库上,我通过在选择查询中添加
FOR XML root('Data')和FOR XML, XMLSCHEMA子句来生成一个xml 字符串和一个xsd 架构字符串。 - 导入: 在目标数据库上,我使用生成的 xsd 通过 SQLXMLBulkLoad 批量加载生成的 xml 文件。
但我不能完全做到这一点。在导出和导入之间,我必须对 xsd 架构进行一些小的修改。
例如,我通过以下查询生成 xml 和 xsd 字符串:
select top 3 * FROM myTable
FOR XML AUTO, ELEMENTS
,Root('Data')
和
SELECT top 0 * FROM myTable
FOR XML AUTO, ELEMENTS
,XMLSCHEMA
生成的 generate.xml 和 generated.xsd 如下所示:
<Data>
<myTable>
<field1>value11</field1>
...
<field1>value1n</field1>
</myTable>
<myTable>
<field1>value21</field1>
...
<field1>value2n</field1>
</myTable>
<myTable>
<field1>value31</field1>
...
<field1>value3n</field1>
</myTable>
</Data>
和
<xsd:schema
targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1"
xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet1"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes"
elementFormDefault="qualified">
<xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd"/>
<xsd:element name="myTable">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="field1" type="..." .../>
...
<xsd:element name="fieldn" type="..." ... />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
但如果我想通过这样的 vb 脚本批量加载
set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0")
objBL.ConnectionString = "provider=SQLOLEDB.1;data source=localhost\SQLEXPRESS;database=Testdb;uid=sa;pwd=*****"
objBL.ErrorLogFile = ".\error.xml"
objBL.KeepIdentity = False
objBL.Execute "generated.xsd", "generated.xml"
set objBL=Nothing
只有当我在 generate.xsd 中进行以下修改时,这才有效
- 删除这个
xsd:schema属性:targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" - 添加此
xsd:schema属性:xmlns:sql="urn:schemas-microsoft-com:mapping-schema" - 将
<myTable>元素替换为<myTable>元素序列,并将整个元素包装成<xsd:element name="Data" sql:is-constant="1">元素 - 将属性
maxOccurs="unbounded" sql:relation="myTable"添加到<myTable>元素
所以,真正适合通过SQLXMLBulkLoad批量加载生成的xml的修改后的xsd看起来像这样:
<xsd:schema
xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet1"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes"
elementFormDefault="qualified">
<xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd"/>
<xsd:element name="Data" sql:is-constant="1">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="myTable" maxOccurs="unbounded" sql:relation="myTable">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="field1" type="..." .../>
...
<xsd:element name="fieldn" type="..." ... />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
我想知道是否可以修改生成的 sql 查询和/或 vbscript,以便生成的 xml 和 xsd 与 vbscript 一起使用而无需任何手动修改?
【问题讨论】:
-
这是一个非常好的问题(我这边+1)!清楚,有代码,但是 - 我很抱歉 - 但没有回答...... SQL-Server提供
XMLSCHEMA和XMLDATA来生成两个不同版本的(嵌入式)元描述。这显然不能满足您的需求。您可以使用 vb 的字符串方法来修改它。也许其他人知道得更好......
标签: sql-server xml vbscript xsd sqlxml