zoukankan      html  css  js  c++  java
  • 将指定的表/视图中的数据导出为 html 文件

     
    转载: http://blog.csdn.net/zjcxc/article/details/3264186

    IF OBJECT_ID(N'dbo.p_ExportHtml') IS NOT NULL

        DROP PROC dbo.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(引用请保留此信息) =============== */

    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

  • 相关阅读:
    如何利用docker制作自己的镜像
    python 获取当前运行的 class 和 方法的名字
    UnitTest-case参数化
    值得推崇的一种图书出版的方式----开源图书
    Django中对数据查询、删除、修改
    wireshark网络实战分析二
    wireshark网络抓包分析
    邮件传输协议实战抓包分析
    socket服务端给客户端发送数据第一次不成功,第二次成功
    转载:Wireshark抓包详解
  • 原文地址:https://www.cnblogs.com/lhws/p/2465079.html
Copyright © 2011-2022 走看看