SQL查询结果导出XML文件简单的方法

最近需要把数据导成XML,不想通过编程实现,手工使用导入导出工具又觉得麻烦,想想还是写SQL语句运行的好,以后扩展也方便,但Microsoft好像并没有提供什么SQL语句可以直接导出方法,用bcp导出的都是文本、EXCEL或其他什么的,本来以为可以把查询结果通过bcp导出文本的形式,但经过N次试验,导出的XML不知道为什么都会自动换行,一打开就会报错,百思不得其解,而且导出的XML没有一个<Root>,这也是个麻烦事。

首先要做的准备工作是启用SQL中master数据库中的系统扩展存储过程[master].sys.xp_cmdshell。通过如下方法开启此存储过程:

-- 允许配置高级选项
EXEC sp_configure 'show advanced options', 1
GO
-- 重新配置
RECONFIGURE
GO
-- 启用xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 1
GO
--重新配置
RECONFIGURE
GO

--执行想要的xp_cmdshell语句
Exec xp_cmdshell 'query user'
GO

--用完后,要记得将xp_cmdshell禁用(从安全角度安全考虑)
-- 允许配置高级选项
EXEC sp_configure 'show advanced options', 1
GO
-- 重新配置
RECONFIGURE
GO
-- 禁用xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 1
GO
--重新配置
RECONFIGURE
GO
另外关于 xp_cmdshell 存储过程的介绍可以去参考一下另一篇文章: xp_cmdshell存储过程

最关键的就是这两个问题:1.如何使用XML不自动换行;2.如何增加一个<Root>标签;

查看了N篇与其相关的联机帮助,一个xml的数据类型提醒了我,觉得可以把查询结果做为一个变量存储后再导出,通过连接一个视图来增加<Root>标签,以下是样例代码:

USE test
GO
--创建一个表
CREATE TABLE test_blan(x VARCHAR(100),y VARCHAR(100))
GO
--插入数据
INSERT INTO test_blan 
SELECT 'a','a' UNION ALL
SELECT 's','s' UNION ALL
SELECT 'd','d' UNION ALL
SELECT 'f','f' UNION ALL
SELECT 'g','g' UNION ALL
SELECT 'q','q' UNION ALL
SELECT 'w','w' UNION ALL
SELECT 'e','e' UNION ALL
SELECT 'r','r' UNION ALL
SELECT 't','t' UNION ALL
SELECT 'y','y' 
--创建一个视图用于增加<Root>标签
CREATE VIEW test_log AS SELECT 'root' aaaa 
--创建一个表用于存储生成的XML结果
CREATE TABLE TT(aa XML )
--定义一个XML的变量
DECLARE @x XML
--查询生成XML结果并存储到TT表中
SET @x = (SELECT * FROM test_log IRoot,test_blan IData FOR XML AUTO) 
INSERT TT VALUES (@x)
-- 先将原先的123.xml文件删除
exec master.dbo.xp_cmdshell 'del E:\123.xml'
--通过bcp将TT中的XML结果输出
EXEC [master].sys.xp_cmdshell 'bcp Test.dbo.TT out E:/123.xml -c -T -k'
--删除表及视图
DROP TABLE TT 
DROP VIEW Test_Log

这样导出的XML就是个完整的文件了。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值