IFOBJECT_ID(N'dbo.p_ExportHtml')ISNOTNULL
DROPPROCdbo.p_ExportHtml;
GO
/*-- == 导出表/视图中的数据为html 文件======================
此存储过程用于将指定的表/视图中的数据导出为 html 文件
由于是使用存储过程, 因此文件目录基于 sql server 服务器
存储过程中会使用xp_cmdshell 调用bcp 来写文件
因此必须打开xp_cmdshell 功能, 可以使用下面的脚本实现
EXEC sp_configure N'show advanced options', 1 RECONFIGURE;
EXEC sp_configure N'xp_cmdshell', 1 RECONFIGURE;
---------------------------------------------------------
-- 调用示例
EXEC dbo.p_ExportHtml
@object_name = N'sys.objects',
@file_name = N'c:\test.html';
---------------------------------------------------------
-- 环境要求
适用于sql server 2005 或者更高的版本
-- ==== 邹建2008.11(引用请保留此信息) =============== */
CREATEPROCdbo.p_ExportHtml
@object_namesysname,
@file_namenvarchar(260),
@titlenvarchar(1000)=NULL-- html 标题, 为NULL时使用@object_name
AS
SETNOCOUNTON;
DECLARE
@sql_fieldnvarchar(max),
@sql_bodynvarchar(max);
SELECT
@sql_field=N'',
@sql_body=N''
SELECT
@sql_field=@sql_field
+N' UNION ALL SELECT field_name = N'+QUOTENAME(C.name,N''''),
@sql_body=@sql_body
+N', [td/@align] = '
+QUOTENAME(
CASE
WHENT.nameLIKEN'%int'
ORT.nameLIKEN'%money'
ORT.nameIN(N'real',N'float',N'decimal',N'numeric')
THEN'right'
WHENT.nameIN(N'bit')
THEN'center'
ELSE'left'
END,
'''')
+N', [td] = '
+CASE
WHENT.nameIN(N'xml')
THENN'CONVERT(nvarchar(max), '+QUOTENAME(C.name)+N')'
ELSEQUOTENAME(C.name)
END
+N', NULL'
FROMsys.all_columnsC
INNERJOINsys.typesT
ONT.system_type_id=C.system_type_id
ANDT.system_type_id=T.user_type_id
WHERE C.object_id=OBJECT_ID(@object_name)
ORDERBYC.column_id;
IF@@ROWCOUNT= 0
BEGIN
RAISERROR(N'can''t found object "%s"', 16, 1,@object_name);
RETURN-1;
END
DECLARE
@temp_proce_namesysname,
@sqlnvarchar(max),
@cmdnvarchar(4000);
SELECT
@temp_proce_name=QUOTENAME(N'##_'
+CONVERT(char(10),GETDATE(), 112)
+N'_'+CONVERT(char(36),NEWID())
),
@sql=N'
CREATE PROC '+@temp_proce_name+N'
AS
WITH
FIELD AS(
'+STUFF(@sql_field, 1, 11,N'')+N'
),
DATA AS(
SELECT * FROM '+@object_name+N'
)
SELECT
[H1] = N'''+REPLACE(ISNULL(@title,@object_name),N'''',N'''''')+N''',
[table/@border] = 1,
[tr] = (
SELECT
= field_name
FROM FIELD
FOR XML PATH(''th''), TYPE
),
= (
SELECT '+STUFF(@sql_body, 1, 2,N'')+N'
FROM DATA
FOR XML PATH(''tr''), TYPE
)
FOR XML PATH(''html''), TYPE;
';
-- 生成临时处理存储过程
EXECsp_executesql
@sql;
-- 输出结果到文件
SET@cmd=N'bcp "EXEC '+QUOTENAME(DB_NAME())
+N'.'+ @temp_proce_name
+N'" queryout '+QUOTENAME(@file_name,N'"')
+N' /T /w';
colnvarchar(4000)
);
INSERT@tb_re
EXECsys.xp_cmdshell @cmd;
DECLARE
@file_existint;
EXECmaster.sys.xp_fileexist @file_name,@file_existOUTPUT;
-- 删除临时存储过程
IFOBJECT_ID(@temp_proce_name)ISNOTNULL
EXEC(N'DROP PROC '+@temp_proce_name+N';');
-- 检查文件生成是否成功
IF@file_exist= 1
BEGIN
RAISERROR(N'object "%s" output to "%s" succeed.', 10, 1,@object_name,@file_name);
END
ELSE
BEGIN
SELECT*FROM@tb_re;
RAISERROR(N'some error occur when generate html file, please check output information', 16, 1);
RETURN-1;
END
GO
DECLARE
@tb_reTABLE(