大容量导入和导出 XML 文档的示例
来源:互联网 发布:php用户管理系统 编辑:程序博客网 时间:2024/04/29 19:53
可以将 XML 文档大容量导入到 SQL Server 数据库中,也可以从 SQL Server 数据库中大容量导出 XML 文档。本主题提供了这两种情况的示例。
若要将数据从一个数据文件大容量导入 SQL Server 表或未分区视图,可以使用以下工具或命令:
- bcp 实用工具
还可以使用 bcp 实用工具将数据从可执行 SELECT 语句的 SQL Server 数据库的任意位置(包括分区视图)导出。
- BULK INSERT
- INSERT ...SELECT * FROM OPENROWSET(BULK...)
有关详细信息,请参阅使用 bcp 实用工具导入和导出大容量数据和使用 BULK INSERT 或 OPENROWSET(BULK...) 导入大容量数据。
下列示例说明了以下操作内容:
- B. 将 XML 数据大容量导入现有行中
- C. 从包含 DTD 的文件中大容量导入 XML 数据
- D. 使用格式化文件显式指定字段终止符
- E. 大容量导出 XML 数据
A. 以二进制字节流的形式大容量导入 XML 数据
在从文件大容量导入 XML 数据时,如果文件中包含您要应用的编码声明,则应在 OPENROWSET(BULK…) 子句中指定 SINGLE_BLOB 选项。SINGLE_BLOB 选项可确保 SQL Server 中的 XML 分析器根据 XML 声明中指定的编码方案导入数据。
示例表
若要测试示例 A,必须创建示例表 T。
USE tempdb
CREATE TABLE T (IntCol int, XmlCol xml)
GO
示例数据文件
在运行示例 A 之前,必须先创建一个 UTF-8 编码文件 (C:/SampleFolder/SampleData3.txt),该文件应包含指定了 UTF-8 编码方案的以下示例实例。
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<ProductDescription ProductModelID="5">
<Summary>Some Text</Summary>
</ProductDescription>
</Root>
示例 A
此示例使用 INSERT ... SELECT * FROM OPENROWSET(BULK...) 语句中的 SINGLE_BLOB 选项从名为 SampleData3.txt 的文件中导入数据,并在包含单列的示例表 T 中插入一个 XML 实例。
INSERT INTO T(XmlCol)
SELECT * FROM OPENROWSET(
BULK 'c:/SampleFolder/SampleData3.txt',
SINGLE_BLOB) AS x
注释
在这个例子中,通过使用 SINGLE_BLOB,可以避免 XML 文档的编码(由 XML 编码声明所指定)与服务器隐含使用的字符串代码页不匹配的问题。
如果使用 NCLOB 或 CLOB 数据类型且遇到代码页或编码冲突,则必须执行下列操作之一:
- 删除 XML 声明,以成功导入 XML 数据文件的内容。
- 在查询的 CODEPAGE 选项中指定一个代码页,该代码页须与 XML 声明中使用的编码方案相匹配。
- 使用非 Unicode XML 编码方案匹配或解析数据库排序规则设置。
有关 XML 文本编码的详细信息,请参阅 XML 最佳实践。
[首页]
B. 将 XML 数据大容量导入现有行中
此示例使用 OPENROWSET 大容量行集提供程序向示例表 T 中的现有行添加一个 XML 实例。
示例数据文件
示例 B 使用的是上例所使用 SampleData3.txt 示例数据文件的修改版本。若要运行此示例,请按如下所示修改此文件的内容:
<Root>
<ProductDescription ProductModelID="10">
<Summary>Some New Text</Summary>
</ProductDescription>
</Root>
示例 B
-- Query before update shows initial state of XmlCol values.
SELECT * FROM T
UPDATE T
SET XmlCol =(
SELECT * FROM OPENROWSET(
BULK 'C:/SampleFolder/SampleData3.txt',
SINGLE_BLOB
) AS x
)
WHERE IntCol = 1
GO
[首页]
C. 从包含 DTD 的文件中大容量导入 XML 数据
在尝试使用 bcp 命令从包含 DTD 的文件中导入 XML 数据的过程中,可能会出现如下错误:
“SQLState = 42000,NativeError = 6359”
“Error = [Microsoft][SQL Native Client][SQL Server]不允许使用内部子集 DTD 分析 XML。请将 CONVERT 与样式选项 2 一起使用,以启用有限的内部子集 DTD 支持。”
“BCP 复制 %s 失败”
若要解决此问题,可以使用 OPENROWSET(BULK...) 函数,并在命令的 SELECT 子句中指定 CONVERT 选项,以从包含 DTD 的数据文件中导入 XML 数据。该命令的基本语法如下:
INSERT ... SELECT CONVERT(? FROM OPENROWSET(BULK...)
示例数据文件
在测试此大容量导入示例之前,需要先创建一个包含以下示例实例的文件 (C:/temp/Dtdfile.xml):
<!DOCTYPE DOC [<!ATTLIST elem1 attr1 CDATA "defVal1">]><elem1>January</elem1>
示例表
示例 C 使用由以下 CREATE TABLE 语句创建的 T1 示例表:
USE tempdb
CREATE TABLE T1(XmlCol xml);
GO
示例 C
此示例使用 OPENROWSET(BULK...),并在 SELECT 子句中指定了 CONVERT 选项,从而将 XML 数据从 Dtdfile.xml 导入到了示例表 T1 中。
INSERT T1
SELECT CONVERT(xml, BulkColumn, 2) FROM
OPENROWSET(Bulk 'c:/temp/Dtdfile.xml', SINGLE_BLOB) [rowsetresults]
执行 INSERT 语句后,会将 DTD 从 XML 中提取出来,并存储到 T1 表中。
[首页]
D. 使用格式化文件显式指定字段终止符
下面的示例说明如何大容量导入 XML 文档 Xmltable.dat。
示例数据文件
Xmltable.dat 中的文档包含两个 XML 值,每行一个。第一个 XML 值的编码为 UTF-16,第二个值的编码为 UTF-8。
下面的十六进制转储显示了此数据文件的内容:
FF FE 3C 00 3F 00 78 00-6D 00 6C 00 20 00 76 00 *..<.?.x.m.l. .v.*
65 00 72 00 73 00 69 00-6F 00 6E 00 3D 00 22 00 *e.r.s.i.o.n.=.".*
31 00 2E 00 30 00 22 00-20 00 65 00 6E 00 63 00 *1...0.". .e.n.c.*
6F 00 64 00 69 00 6E 00-67 00 3D 00 22 00 75 00 *o.d.i.n.g.=.".u.*
74 00 66 00 2D 00 31 00-36 00 22 00 3F 00 3E 00 *t.f.-.1.6.".?.>.*
3C 00 72 00 6F 00 6F 00-74 00 3E 00 A2 4F 9C 76 *<.r.o.o.t.>..O.v*
0C FA 77 E4 80 00 89 00-00 06 90 06 91 2E 9B 2E *..w.............*
99 34 A2 34 86 00 83 02-92 20 7F 02 4E C5 E4 A3 *.4.4..... ..N...*
34 B2 B7 B3 B7 FE F8 FF-F8 00 3C 00 2F 00 72 00 *4.........<./.r.*
6F 00 6F 00 74 00 3E 00-00 00 00 00 7A EF BB BF *o.o.t.>.....z...*
3C 3F 78 6D 6C 20 76 65-72 73 69 6F 6E 3D 22 31 *<?xml version="1*
2E 30 22 20 65 6E 63 6F-64 69 6E 67 3D 22 75 74 *.0" encoding="ut*
66 2D 38 22 3F 3E 3C 72-6F 6F 74 3E E4 BE A2 E7 *f-8"?><root>....*
9A 9C EF A8 8C EE 91 B7-C2 80 C2 89 D8 80 DA 90 *................*
E2 BA 91 E2 BA 9B E3 92-99 E3 92 A2 C2 86 CA 83 *................*
E2 82 92 C9 BF EC 95 8E-EA 8F A4 EB 88 B4 EB 8E *................*
B7 EF BA B7 EF BF B8 C3-B8 3C 2F 72 6F 6F 74 3E *.........</root>*
00 00 00 00 7A *....z*
示例表
大容量导入或导出 XML 文档时,应当使用在任何文档中都不可能出现的字段终止符;例如,在连续四个 Null (/0) 后紧跟字母 z:/0/0/0/0z。
此示例说明如何为 xTable 示例表使用此字段终止符。若要创建此示例表,请使用下列 CREATE TABLE 语句:
USE tempdb
CREATE TABLE xTable (xCol xml);
GO
示例格式化文件
必须在格式化文件中指定字段终止符。示例 D 使用了一个名为 Xmltable.fmt 的非 XML 格式化文件,该文件包含以下内容:
9.0
1
1 SQLBINARY 0 0 "/0/0/0/0z" 1 xCol ""
可以使用此格式化文件并通过 bcp 命令、BULK INSERT 语句或 INSERT ... SELECT * FROM OPENROWSET(BULK...) 语句将 XML 文档大容量导入到 xTable 表中。
示例 D
此示例在 BULK INSERT 语句中使用 Xmltable.fmt 格式化文件来导入 XML 数据文件 Xmltable.dat 中的内容。
BULK INSERT xTable
FROM 'C:/Xmltable.dat'
WITH (FORMATFILE = 'C:/Xmltable.fmt');
GO
[首页]
E. 大容量导出 XML 数据
下面的示例使用 bcp 命令和同一个 XML 格式化文件从上一示例所创建的表中大容量导出 XML 数据。在下面的 bcp 命令中,<server_name> 和 <instance_name> 代表必须使用相应的值替换的占位符:
bcp bulktest..xTable out a-wn.out -N -T -S<server_name>/<instance_name>
[首页]
概念
导入和导出大容量数据xml 数据类型
在 XML 数据中使用 Unicode
其他资源
INSERT (Transact-SQL)SELECT 子句 (Transact-SQL)
bcp 实用工具
BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
在 SQL Server 中使用 XML
帮助和信息
获取 SQL Server 2005 帮助如果您想将文档的实体和属性提取到相关表中,那么将 XML 文件导入 SQL Server 的最快方法是使用 SQL Server 2000 Web Release (SQLXML) 3.0 Service Pack 1 (SP1) 中的 Bulk Load COM 界面。界面随免费的 SQLXML 下载提供:
这种 XML 导入方法十分迅速,并且此下载用代码示例的形式提供了批量加载工具。
如果您不想将文档的实体和属性提取到相关表中,可使用 textcopy.exe 命令行实用程序。使用 textcopy.exe 是将文档加载到文本数据类型栏的好办法。
如果您的 XML 文档十分简单,可通过编写查看 XML 文档各行内容并将信息提取到表中的转换代码来使用数据转换服务 (DTS)。此方法要求您将 XML 文件定义为输入数据源,将一个数据库表定义为输出数据源,并且编写 ActiveX 脚本分析"<"和">"字符的输入以提取实体、属性和它们的值
可以使用SELECT * FROM TableName FOR XML格式来生成XML结果,再导出成XML文件。
如:EXEC master..xp_cmdshell 'bcp "select * from 数据库名.dbo.表名 for xml auto" queryout E:/boc/DT.xml -c -Sservername -Usa -Ppassword'
2、把XML导到另一个数据库里
先使用系统过展存储过来来提取XML文件内容,再使用sp_xml_preparedocument和sp_xml_removedocument、 OPENXML来转换XML文件内容。这方面网也有一些资料参考,可以在baidu输入 如“从SQL Server中读取XML文件”可以找想相关的方法,楼主可以试试。
- 大容量导入和导出 XML 文档的示例
- 大容量导入和导出 XML 文档的示例
- SQL Server大容量导入和导出 XML 文档的示例
- 【关于数据大容量的导入导出小结】
- 关于数据大容量的导入导出小结
- SQL Server大容量导入导出
- xml的导入和导出
- xml导入和导出
- 【SQL SERVER中关于大容量数据的导入导出总结】
- oracle大数据量的导入和导出
- 大数据的导入和导出
- 导入与导出数据 大容量复制程序(bcp)
- mysql高速导入导出大容量TXT文本
- Excel文档导出和导入
- 自己总结的大数据的导入和导出
- 导出导入xml的实现
- 【转】oracle大数据量的导入和导出
- 一个ORACLE导入和导出XML文件的例子
- printf函数
- 如何通过使用 ADOX 和 VisualC # .NET 创建 Access 数据库
- DB2管理服务器的相关命令
- Java Web 服务,第 2 部分: 深度探索 Axis2:AXIOM
- MSN Messenger 化繁为简(用 Visual Studio 2005 去掉 MSN 广告)
- 大容量导入和导出 XML 文档的示例
- 任意系统,任意机子F11一键恢复轻松搞定
- 培养正确电脑使用习惯,破除杀毒软件迷信
- c++入门学习笔记继承
- 一个脚本,可以根据参数文件名,以正确的参数调用tar来解压缩tar.gz或tar.bz2文件
- linux学习笔记
- 搬家很久了。
- Hbernate进行多表查询
- 返回数据库中所有表名