动态解析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 ...
随机推荐
- python☞自动发送邮件
一.SMTP 协议 SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式 二.smtplib ...
- 你不需要 jQuery,但你需要一个 DOM 库
写这篇文章的目的,一方面是介绍一下自己编写的模块化 DOM 库 domq.js,另一方面是希望大家对 jQuery 有一个正确的认识,即使 jQuery 已经逐渐退出历史舞台,但是它的 API 将会以 ...
- [原创]Java应用性能远程监控系统(C/S架构)
Java应用性能远程监控系统(使用C/S架构) 适用于监控所有Java应用,具有堆内存监控.方法区监控.GC监控.类加载监控.类编译监控与线程监控,提供堆快照下载,线程快照下载.体验网址:http:/ ...
- 播放包含flash内容的网页或flash内容, 无法显示相应flash内容
问题描述 通过Messenger发布的html5网页到player, 如下图所示: 布局播放效果: 解决办法 从Cnario Player菜单栏打开Setting>>Canvas Cont ...
- js函数库-D3
推荐: https://www.cnblogs.com/createGod/p/6884629.html
- P3373 【模板】线段树 2
线段树的模板,但是还应注意维护乘标记,乘法的优先级大于加法,一定记得还要取模. #include<bits/stdc++.h> using namespace std; ; struct ...
- vue项目上传Github预览
最近在用Vue仿写cnode社区,想要上传到github,并通过Github pages预览,在这个过程中遇到了一些问题,因此写个笔记,以便查阅. 完成Vue项目以后,在上传到github之前,需要修 ...
- JAVA流读取文件并保存数据
如图有文本如下数据 写方法读取数据 private String[][] getData(){ // 使用ArrayList来存储每行读取到的字符串 ArrayList<String> a ...
- iOS 使用百度的人脸识别登录验证,解决认证失败不跳转界面连续认证,认证相似度对比
在使用百度人脸识别出现的问题:小米6调用摄像机是黑白的一个情况,iOS上会出现识别准确性上的问题(多次代开认证,会通过) 人脸识别(活体验证): 1.芝麻认证 : 0.4元/次,需要企业企业认证.不能 ...
- 本机Jenkins的使用
1.启动jenkins: 命令:java -jar D:\toolspackage\jenkins\jenkins.war 打开jenkins网页:http://localhost:8080/ 2. ...