动态解析xml,并生成excel,然后发邮件。
直接贴代码了!
DECLARE @CurrentServer NVARCHAR(100)
DECLARE @CurrentDatabase NVARCHAR(100)
DECLARE @CurrentLoginName NVARCHAR(100)
DECLARE @CurrentLoginPwd NVARCHAR(100)
-----配置数据库连接(【【需要用户自己设置】】)
SET @CurrentServer='.'
SET @CurrentDatabase='test'
SET @CurrentLoginName='sa'
SET @CurrentLoginPwd='www123'
-----
--启用xp_cmdshell组件
EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
----------开启正则验证组件
EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'Ole Automation Procedures', 1
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
----------
----------读取报表数据
SELECT IDENTITY(INT,1,1) AS id_index,ID,SENDINGTIME,NAME INTO #xmlReport FROM dbo.REPORTS WHERE SENDINGTIME IS NOT NULL
----------
DECLARE @xmlReportCount INT=(SELECT COUNT(*) FROM #xmlReport)
DECLARE @j INT=1
WHILE @j<=@xmlReportCount
BEGIN
DECLARE @fileID NVARCHAR(500),@SENDINGTIME DATETIME,@REPORTNAME NVARCHAR(500)
SELECT @fileID=ID,@SENDINGTIME=SENDINGTIME,@REPORTNAME=NAME FROM #xmlReport WHERE id_index=@j
IF @SENDINGTIME=CONVERT(NVARCHAR(500),GETDATE(),23)
BEGIN
--------------------------原来的xml解析出sql语句
DECLARE @StrSql NVARCHAR(max)
DECLARE @str NVARCHAR(max)
---txt文件用SINGLE_CLOB
---xml文件用SINGLE_BLOB
-----设置excel文件存放的目录(【【需要用户自己设置】】)
DECLARE @xlsFilePath NVARCHAR(2000)
DECLARE @xlsPath NVARCHAR(500)
SET @xlsPath='d:\'
DECLARE @xlsName NVARCHAR(500)
SET @xlsName=@fileID+'.xls'
SET @xlsFilePath=@xlsPath+@xlsName
------
------读取xml的文件目录(【【需要用户自己设置】】)
DECLARE @path NVARCHAR(2000)
DECLARE @filePath nvarchar(600)
DECLARE @fileName nvarchar(400)
SET @filePath='F:\projects\GroupProcess\Web Site\Upload\'
SET @fileName=@fileID+'.xml'
set @path=@filePath+@fileName
------
------根据xml文件的目录,判断当前目录下是否存在这个xml文件,存在为1,不存在为0
declare @result int
exec master.dbo.xp_fileexist @path,@result output
------
IF @result=1 --1文件存在 0文件不存在
BEGIN
DECLARE @cmd NVARCHAR(2000)
set @cmd='SELECT @str=CAST(CAST(BulkColumn AS XML) AS NVARCHAR(max))
FROM OPENROWSET (BULK '''+@path+''', SINGLE_BLOB) MyFile'
exec sp_executesql @cmd,N'@str NVARCHAR(max) output',@str OUTPUT
IF @str<>'' --当前的xml文档的内容不为空
BEGIN
SET @str=REPLACE(REPLACE(REPLACE(@str,'xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"',''),'xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"',''),'rd:','')
declare @XMLVar xml =CAST(REPLACE(@str,'encoding="UTF-8"','') AS XML)
select @StrSql=@XMLVar.value('/Report[1]/DataSets[1]/DataSet[1]/Query[1]/CommandText[1]','varchar(MAX)')
DECLARE @moduleName NVARCHAR(500)
DECLARE @moduleNameUpper NVARCHAR(500)
DECLARE @moduleNameLower NVARCHAR(500)
SELECT @moduleName=@XMLVar.value('/Report[1]/CustomProperties[1]/CustomProperty[1]/Value[1]','varchar(MAX)')
SELECT @moduleNameUpper='"'+UPPER(@moduleName)+'.'
SELECT @moduleNameLower='"'+@moduleName+'.'
--------------------------
--------------------------将sql的where条件的数据取出来
DECLARE @paramvalues XML
select @paramvalues=@XMLVar.query('/Report/DataSets/DataSet/Query/QueryParameters')
DECLARE @ItemTables TABLE(id INT IDENTITY(1,1) PRIMARY KEY,fieldname NVARCHAR(300),datafield NVARCHAR(300))
INSERT INTO @ItemTables
(
fieldname,
datafield
)
SELECT
T.c.value('@Name','NVARCHAR(300)'),
RTRIM(LTRIM(REPLACE(REPLACE(T.c.value('(Value/text())[1]','NVARCHAR(300)'),'=',''),'"','''')))
FROM @paramvalues.nodes('/QueryParameters/QueryParameter') AS T(c)
DECLARE @rows INT=(SELECT COUNT(*) FROM @ItemTables)
DECLARE @i INT=1
WHILE @i<=@rows
BEGIN
DECLARE @fieldname NVARCHAR(max),@datafield NVARCHAR(max)
SELECT @fieldname=fieldname,@datafield=datafield FROM @ItemTables WHERE id=@i
SET @StrSql=REPLACE(@StrSql,@fieldname,@datafield)
SET @i=@i+1
END
------------------------将sql的where条件的数据取出来
DECLARE @regexStr NVARCHAR(max)=''+@CurrentDatabase+'.dbo.regexReplace('+@CurrentDatabase+'.dbo.regexReplace('+@CurrentDatabase+'.dbo.regexReplace('+@CurrentDatabase+'.dbo.regexReplace('''+@StrSql+''','''+@moduleNameLower+''','''',1,0),'''+@moduleNameUpper+''','''',1,0),''"'','''',1,0),''from'','',2 as sort into #temps from'',1,0)'
SET @regexStr='SELECT @StrSql='+@regexStr
--SELECT @StrSql=dbo.regexReplace(dbo.regexReplace(dbo.regexReplace(dbo.regexReplace(@StrSql,@moduleNameLower,'',1,0),@moduleNameUpper,'',1,0),'"','',1,0),'from',',2 as sort into #temps from',1,0)
EXEC sp_executesql @regexStr,N'@StrSql NVARCHAR(MAX) OUTPUT',@StrSql OUTPUT
------------------------查询报表表头
select @paramvalues=@XMLVar.query('/Report/Body/ReportItems/Table/Header/TableRows/TableRow/TableCells')
SELECT IDENTITY(INT,1,1) AS id,'groupByName' AS groupByName,* INTO #temp FROM (
SELECT
RTRIM(LTRIM(REPLACE(REPLACE(T.c.value('(Value/text())[1]','NVARCHAR(300)'),'=',''),'"',''''))) b
FROM @paramvalues.nodes('/TableCells/TableCell/ReportItems/Textbox') AS T(c)) a
------------------------查询报表表头
------------------------最终导出excel的临时表
DECLARE @sql_str NVARCHAR(MAX)
DECLARE @sql_col NVARCHAR(MAX)
DECLARE @sql_where NVARCHAR(MAX)
DECLARE @tableName SYSNAME --行转列表
DECLARE @groupColumn SYSNAME --分组字段
DECLARE @row2column SYSNAME --行变列的字段
DECLARE @row2columnValue SYSNAME --行变列值的字段
SET @tableName = '#temp'
SET @groupColumn = 'groupByName'
SET @row2column = 'id'
SET @row2columnValue = 'b'
SET @sql_where = 'WHERE groupByName = ''groupByName'''
--从行数据中获取可能存在的列
SET @sql_str = N'
SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])
FROM ['+@tableName+'] '+@sql_where+' GROUP BY ['+@row2column+']'
--PRINT @sql_str
EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT
--PRINT @sql_col
SET @sql_str = N'
SELECT *,1 as sort into #temp1 FROM (
SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']'+@sql_where+') p PIVOT
(max(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt
ORDER BY pvt.['+@groupColumn+']'
--PRINT (@sql_str)
EXEC (
'
use '+@CurrentDatabase+'
'+@sql_str+'
alter table #temp1 drop column groupByName
'+@StrSql+'
insert into #temp1 select * from #temps
select * into testTable from #temp1 order by sort asc
alter table testTable drop column sort
drop table #temps
'
)
SET @sql_col=NULL
---------------------最终导出excel的临时表
DECLARE @bcpStr NVARCHAR(500)
SET @bcpStr='bcp "select * from '+@CurrentDatabase+'..testTable" queryout "'+@xlsFilePath+'" -c -w -S"'+@CurrentServer+'" -U"'+@CurrentLoginName+'" -P"'+@CurrentLoginPwd+'"'
EXEC master..xp_cmdshell @bcpStr
exec(' use '+@CurrentDatabase+'; DROP TABLE testTable')
DROP TABLE #temp
-------------send email(【【需要用户自己设置】】)
use msdb
DECLARE @bodyContent NVARCHAR(max)='This '+@REPORTNAME+' report has been sent successfully.'
Exec dbo.sp_send_dbmail @profile_name='linxianfeng',
@recipients='850519458@qq.com',
@subject=@REPORTNAME,
@body=@bodyContent,
@file_attachments = @xlsFilePath
-------------
--------更改report报表的ISSENDED为1,标记为已发送过邮件
EXEC('UPDATE '+@CurrentDatabase+'.dbo.REPORTS SET ISSENDED=1 WHERE ID='''+@fileID+'''')
END
END
END
SET @j=@j+1
END
DROP TABLE #xmlReport
-------关闭xp_cmdshell组件
EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'xp_cmdshell', 0
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
-------
-------关闭正则验证组件
EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'Ole Automation Procedures', 0
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
-------
正则函数
USE [test]
GO
/****** Object: UserDefinedFunction [dbo].[regexReplace] Script Date: 08/13/2015 11:44:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE function [dbo].[regexReplace]
(
@source ntext, --原字符串
@regexp varchar(8000), --正则表达式
@replace varchar(8000), --替换值
@globalReplace bit = 1, --是否是全局替换
@ignoreCase bit = 0 --是否忽略大小写
)
returnS varchar(8000) AS
begin
declare @hr integer
declare @objRegExp integer
declare @result varchar(8000)
exec @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'Global', @globalReplace
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OAMethod @objRegExp, 'Replace', @result OUTPUT, @source, @replace
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OADestroy @objRegExp
IF @hr <> 0 begin
return null
end
return @result
end
GO
动态解析xml,并生成excel,然后发邮件。的更多相关文章
- Python 解析 XML 文件生成 HTML
XML文件result.xml,内容如下: <ccm> <metric> <complexity>1</complexity> <unit> ...
- Java解析XML与生成XML文件
XML是eXtensible Markup Language(可扩展标记语言)的简写形式,它是一种元标记语言(meta-markup language),也就是说它没有一套能够适用于各个领域中所有用户 ...
- Excel 数据导入SQL XML 自动生成表头
去出差的时候应客户要求要要将Excel 文件内的数据批量导入到数据库中,而且有各种不同种类的表格,如果每一个表格多对应一个数据表的话, 按照正常的方法应该是创建数据表,创建数据库中映射的数据模型,然后 ...
- 利用freemarker+SAX解析xml的方式对excel文件字段校验
利用freemarker对参数进行校验这篇文章主要用到的技术点: 自定义注解的使用反射机制SAX解析xmlFreemarker的运用我们在工作中经常需要上传excel文件,然后在对文件中的字段进行校验 ...
- Android 解析XML文件和生成XML文件
解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...
- 在Salesforce中处理Xml的生成与解析
在Salesforce中处理Xml的生成与解析 1): Generate Xml private String ConvertAccountToXmlInfo(Account acc){ Dom.Do ...
- java生成解析xml的另外两种方法Xstream
Xstream生成和解析xm和JAXB生成和解析xml的方法. 一,Xstream Xstream非jdk自带的,需要到入Xstream-1.4.3.jar和xpp3_min-1.1.4.jar 1. ...
- 使用XML序列化器生成XML文件和利用pull解析XML文件
首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...
- Android 生成和Pull解析xml
一.单个对象生成xml 生成以下xml,该怎么生成呢? <?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <accou ...
随机推荐
- Centos7安装搜狗输入法.
系统默认安装输入法管理器的是 ibus. 而搜狗使用 fcitx 1.以我们先要安装 fcitx和必要的软件包 yum -y install fcitx* yum -y install libQtWe ...
- uWSGI、WSGI、uwsgi是什么?
uWSGI是一个web服务器,它实现了WSGI协议.uwsgi协议.HTTP等协议: WSGI是web服务器网管接口,是一套协议,用于接收用户请求并将请求进行初次封装,然后交给web框架: uwsgi ...
- CentOS7.x编译安装zabbix4.0
编译安装zabbix Zabbix简介 Zabbix 是一个企业级的分布式开源监控方案. Zabbix是一款能够监控各种网络参数以及服务器健康性和完整性的软件.Zabbix使用灵活的通知机制,允许用户 ...
- 使用 JS 输出螺旋矩阵
关于螺旋矩阵 这是我曾经遇到过的面试题,在 LeetCode 上找到了题目的原型,难度中等.题目描述如下: 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中 ...
- 分布式存储ceph——(2)openstack对接ceph存储后端
ceph对接openstack环境 一.使用rbd方式提供存储如下数据: (1)image:保存glanc中的image: (2)volume存储:保存cinder的volume:保存创建虚拟机时选择 ...
- CentOS配置svn
参考: https://www.cnblogs.com/taohaijun/p/7172939.html 1.检查已安装版本 rpm -qa subversion 卸载旧版本SVN yum remo ...
- CodeForces Round #555 Div.3
A. Reachable Numbers 代码: #include <bits/stdc++.h> using namespace std; ; int N; set<int> ...
- 前端可视化项目流程,涉及three.js(webGL),3DMax技术,持续更新
最近在做一个可视化展示的项目,记录一下流程: 建模,模型来源,可以参考沙盘展示类项目,自己建模或者拼装其他源模型(本人以前是3D建模师,可以应付一些简单的场景) 有效模型导入到web端,这里采用的ob ...
- whois 查询 API
项目介绍 免费Whois查询接口,完全开放 API接口,返回JSON格式数据(支持POST,GET方式) 网页查询接口(支持POST,GET方式) 测试接口 页面: http://whois.tt80 ...
- 【CSA49F】【XSY3317】card 博弈论 DP
题目大意 不会博弈论的 yww 在和博弈论大师 yxq 玩一个游戏. 有 \(n\) 种卡牌,第 \(i\) 种卡牌有 \(b_i\) 张. yww 会先把所有 \(B=\sum_{i=1}^nb_i ...