SQL Server 使得以XML导出数据变得更加简单但在SQL Server 中导入XML数据并对其进行处理则有些麻烦
如果你参考Books Online(BOL)你会发现有相关的条目包括OPENXML以及 OPENROWSET所有的这些例子都支持将XML文本作为已经声明的变量这对于经常处理文本的用户来说非常方便但对于希望在开发中读取XML文件并进行相应处理的开发人员来说就不是这样了处理这样的问题或许最好从内到外来对其进行分析
OPENXML是一个rowset函数(即返回一个rowset)它的工作方式类似于rowset函数OPENQUERY和 OPENROWSET使用OPENXML可以对XML数据执行JOINs操作而无需首先导入数据你还可以将其同INSERTSELECT UPDATE以及DELETE等操作联合使用然而要使用OPENXML你必须执行两项OPENQUERY和OPENROWSET并不需要的任务这两项任务需要两个系统存储进程 第一个是sp_xml_preparedocument它将读取特定的XML文本并将其内容提取到内存中其语法如下
sp_xml_preparedocument @hdoc = OUTPUT
[ @xmltext = ]
[ @xpath_namespaces =
具体参数如下 @hdoc指向某内存区域的句柄(从作用上看等同于一个指针)相关数据存放在这里注意这是一个输出变量当该进程运行后该变量将包含指向XML文件内容在内存地址的句柄由于你需要在随后使用此结果因此要确保对其进行保存; @xmltext实际上你所希望处理的XML文本; @xml_namespaces为了正常操作你的XML数据所需要的任何名字空间索引(namespace references)注意在这里出现的任何URL都需要用尖括号(< >)括起来; 假设所传递的这些参数都有效并且XML文档存在那么你的XML数据就会被存放到内存中去现在你就可以调用 sp_xml_preparedocument传递存放有XML文件的变量然后执行OPENXML语法如下
OPENXML(idocint [in]rowpatternnvarchar[in][flagsbyte[in]])
[WITH (SchemaDeclaration | TableName)]
注意在本文中没有足够的文字来描述OPENXML所接收的参数请参阅BOL以获取更多信息在TransactSQL Reference中查找OPENXML
现在我们已经到达了最后的步骤所有剩下的工作就是导入一个实际的XML文件到SQL并进行处理(很奇快为什么所有的BOL示例都没有涉及到这一关键的部分)(我必须感谢我的同事Billy Pang所给予的帮助他帮助我解决这个问题并给出了代码——尽管出于本文需要我对代码进行了裁减谢谢Billy!) 基本的技巧是将文件逐行按文本读取然后把所有读取的行连接为一个大的VARCHAR变量最后将变量传递给前面所说的代码
以下就是读取文件并将其内容存放到某变量的代码
DECLARE @FileName varchar()
DECLARE @ExecCmd VARCHAR()
DECLARE @y INT
DECLARE @x INT
DECLARE @FileContents VARCHAR()
CREATE TABLE #tempXML(PK INT NOT NULL IDENTITY() ThisLine VARCHAR())
SET @FileName = C:TempCurrentSettingsxml
SET @ExecCmd = type + @FileName
SET @FileContents =
INSERT INTO #tempXML EXEC masterdboxp_cmdshell @ExecCmd
SELECT @y = count(*) from #tempXML
SET @x =
WHILE @x < > @y
BEGIN
SET @x = @x +
SELECT @FileContents = @FileContents + ThisLine from #tempXML WHERE PK
= @x
END
SELECT @FileContents as FileContents
DROP TABLE #tempXML
现在在变量@FileContents变量中你已经获得了文件的全部内容所需要做的只是将变量通过@xmltext参数传递给sp_xml_preparedocument然后再调用OPENXML
有了这种解决办法对XML文档进行各种处理就成为了可能你可以将XML文档同SQL表格连接在一起而无需导入数据然后对这些数据进行INSERTPDATE和DELETE等任何操作