📄 新建 文本文档 (2).txt
字号:
SELECT * from T
UPDATE T
SET XmlCol =(
SELECT * FROM OPENROWSET(
BULK 'C:\SampleFolder\SampleData3.txt',
SINGLE_BLOB
) AS x
)
WHERE IntCol = 1
SQL Server 2008 联机丛书(2008 年 8 月)
大容量导入和导出 XML 文档的示例
可以将 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...) 导入大容量数据。
示例
下列示例说明了以下操作内容:
A. 以二进制字节流的形式大容量导入 XML 数据
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 编码方案匹配或解析数据库排序规则设置。
[返回页首]
B. 将 XML 数据大容量导入现有行中
此示例使用 OPENROWSET 大容量行集提供程序向示例表 T 中的现有行添加一个 XML 实例。
注意:
若要运行此示例,必须先完成示例 A 中提供的测试脚本。该示例创建了 tempdb.dbo.T 表,并从 SampleData3.txt 中大容量导入数据。
示例数据文件
示例 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 数据
安全说明:
若非您的 XML 环境有特殊要求,建议不要启用对文档类型定义 (DTD) 的支持。启用 DTD 支持会增加服务器的可攻击外围应用,并且可能会使它受到拒绝服务攻击。如果必须启用 DTD 支持,可以通过仅处理可信的 XML 文档来降低安全风险。
在尝试使用 bcp 命令从包含 DTD 的文件中导入 XML 数据的过程中,可能会出现如下错误:
“SQLState = 42000,NativeError = 6359”
“错误 = [Microsoft][SQL Server 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。
下面的十六进制转储显示了此数据文件的内容:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -