首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载 ┆ 端午节祝福 ┆ 迅雷在线影视 ┆淘宝手机在线充值 ┆淘宝游戏点卡充值 
设为首页
加入收藏
联系我们
高级搜索
您当前的位置: 主页>数据库>SQL数据库>实现sql2005导出表或视图中的数据为html文件
实现sql2005导出表或视图中的数据为html文件
来源: 发布时间:2008-11-10 发布人: 浏览: 人次   字体: [ ]  

/*-- == 导出表/视图中的数据为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(引用请保留此信息) =============== */
IF OBJECT_ID(N'dbo.p_ExportHtml') IS NOT NULL
    DROP PROC dbo.p_ExportHtml;
GO

CREATE PROC dbo.p_ExportHtml
    @object_name sysname,
    @file_name nvarchar(260),
    @title nvarchar(1000) = NULL -- html 标题, 为NULL时使用@object_name
AS

SET NOCOUNT ON;

DECLARE

    @sql_field nvarchar(max),
    @sql_body nvarchar(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
                         WHEN T.name LIKE N'%int'
                                OR T.name LIKE N'%money'
                                OR T.name IN(N'real', N'float', N'decimal', N'numeric')
                            THEN 'right'
                         WHEN T.name IN(N'bit')
                            THEN 'center'
                         ELSE 'left'
                     END,
                     '''')
           + N', [td] = '
              + CASE
                  WHEN T.name IN(N'xml')
                     THEN N'CONVERT(nvarchar(max), ' + QUOTENAME(C.name) + N')'
                  ELSE QUOTENAME(C.name)
              END

           + N', NULL'

FROM sys.all_columns C
    INNER JOIN sys.types T
       ON T.system_type_id = C.system_type_id
           AND T.system_type_id = T.user_type_id
WHERE  C.object_id = OBJECT_ID(@object_name)

ORDER BY C.column_id;

IF @@ROWCOUNT = 0
BEGIN
    RAISERROR(N'can''t found object "%s"', 16, 1, @object_name);
    RETURN -1;

END

DECLARE
    @temp_proce_name sysname,
    @sql nvarchar(max),
    @cmd nvarchar(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;

';

-- 生成临时处理存储过程

EXEC sp_executesql
    @sql;

-- 输出结果到文件

SET @cmd = N'bcp "EXEC ' + QUOTENAME(DB_NAME())
       + N'.' +  @temp_proce_name
       + N'" queryout ' + QUOTENAME(@file_name, N'"')
       + N' /T /w';
DECLARE @tb_re TABLE(
    col nvarchar(4000)
);

INSERT @tb_re
EXEC sys.xp_cmdshell @cmd;
DECLARE
    @file_exist int;
EXEC master.sys.xp_fileexist @file_name, @file_exist OUTPUT;


-- 删除临时存储过程

IF OBJECT_ID(@temp_proce_name) IS NOT NULL
    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


相 关 文 章   发布商链接
·实例讲解将当前库所有表的smalldatet...
·SQl语句中newid与union 发生冲突的解...
·如何用SQL语句查询每个分组的前N条记...
·sql精确查询2个时间范围内的记录,有...
·SQL2005利用xml在指定分隔符的情况下...
·如果SQL Server2000安装失败了该怎么...
·为什么安装SQL Server软件会要求关闭...
·如何安装Analysis Services?
·如何知道计算机运行的各种实例的安装...
·如何知道本机安装了多少个SQL实例?
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·SQL数据库实现用SQL语句根据...
·SqlServer 2005 Express的配...
·sql排序规则的简介及其修改操
·如何用sql语句为字段添加和去
·sqlserver数据库日志文件压缩
·sql语句获得数据库某表字段的
·ISNUMERIC函数介绍及其要注意
·SQLServer2005导入xml文件实...
·SQL Server2005中删除表中重...
·如何手工启动SQLServer的全文
·sql删除数据库中的所有表语句
·SqlServr利用触发器来控制某...
·SQLServer常用日期格式转换方
·用sql实现查询重复记录的代码
·SQLServer2005分解导入xml文...
热 门 文 章
·图解SQL2008安装向导的使用
·实现Excel数据导入到SQL2005...
·SQLServer常用日期格式转换方...
·MS sql安装时“无法在COM+目...
·sql语句联合删除多个表技巧
·sql删除数据库中的所有表语句
·Sql Server端口连接的问题
·如何在SQL Server中得到自动...
·sql排序规则的简介及其修改操...
·SQL Server2005中删除表中重...
·分析SQL2005最新高效分页方法
·小解sqlServer中临时表及表变...
·用sql实现查询重复记录的代码
·MS SQL2005无法远程连接问题...
·如何修改sqlserver数据库名称
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .