管理

将指定的表/视图中的数据导出为 html 文件

Posted on 2009-08-30 17:02  lzhdim  阅读(500)  评论(0编辑  收藏  举报
  1. IF OBJECT_ID(N'dbo.p_ExportHtml') IS NOT NULL
  2.  
  3.  DROP PROC dbo.p_ExportHtml;
  4.  
  5.  GO
  6.  
  7.  
  8.  
  9.  /*-- == 导出表/视图中的数据为html 文件======================
  10.  
  11.  
  12.  
  13. 此存储过程用于将指定的表/视图中的数据导出为 html 文件
  14.  
  15. 由于是使用存储过程, 因此文件目录基于 sql server 服务器
  16.  
  17.  
  18.  
  19. 存储过程中会使用xp_cmdshell 调用bcp 来写文件
  20.  
  21. 因此必须打开xp_cmdshell 功能, 可以使用下面的脚本实现
  22.  
  23. EXEC sp_configure N'show advanced options', 1 RECONFIGURE;
  24.  
  25. EXEC sp_configure N'xp_cmdshell', 1 RECONFIGURE;
  26.  
  27.  
  28.  
  29. ---------------------------------------------------------
  30.  
  31. -- 调用示例
  32.  
  33. EXEC dbo.p_ExportHtml
  34.  
  35. @object_name = N'sys.objects',
  36.  
  37. @file_name = N'c:\test.html';
  38.  
  39.  
  40.  
  41. ---------------------------------------------------------
  42.  
  43. -- 环境要求
  44.  
  45. 适用于sql server 2005 或者更高的版本
  46.  
  47.  
  48.  
  49. -- ==== 邹建2008.11(引用请保留此信息) =============== */
  50.  
  51.  CREATE PROC dbo.p_ExportHtml
  52.  
  53. @object_name sysname,
  54.  
  55. @file_name nvarchar(260),
  56.  
  57. @title nvarchar(1000) = NULL -- html 标题, 为NULL时使用@object_name
  58.  
  59.  AS
  60.  
  61.  SET NOCOUNT ON;
  62.  
  63.  
  64.  
  65.  DECLARE
  66.  
  67. @sql_field nvarchar(max),
  68.  
  69. @sql_body nvarchar(max);
  70.  
  71.  SELECT
  72.  
  73. @sql_field = N'',
  74.  
  75. @sql_body = N''
  76.  
  77.  SELECT
  78.  
  79. @sql_field = @sql_field
  80.  
  81. + N' UNION ALL SELECT field_name = N' + QUOTENAME(C.name, N''''),
  82.  
  83. @sql_body = @sql_body
  84.  
  85. + N', [td/@align] = '
  86.  
  87. + QUOTENAME(
  88.  
  89.  CASE
  90.  
  91.  WHEN T.name LIKE N'%int'
  92.  
  93.  OR T.name LIKE N'%money'
  94.  
  95.  OR T.name IN(N'real', N'float', N'decimal', N'numeric')
  96.  
  97.  THEN 'right'
  98.  
  99.  WHEN T.name IN(N'bit')
  100.  
  101.  THEN 'center'
  102.  
  103.  ELSE 'left'
  104.  
  105.  END,
  106.  
  107.  '''')
  108.  
  109. + N', [td] = '
  110.  
  111. + CASE
  112.  
  113.  WHEN T.name IN(N'xml')
  114.  
  115.  THEN N'CONVERT(nvarchar(max), ' + QUOTENAME(C.name) + N')'
  116.  
  117.  ELSE QUOTENAME(C.name)
  118.  
  119.  END
  120.  
  121. + N', NULL'
  122.  
  123.  FROM sys.all_columns C
  124.  
  125.  INNER JOIN sys.types T
  126.  
  127.  ON T.system_type_id = C.system_type_id
  128.  
  129.  AND T.system_type_id = T.user_type_id
  130.  
  131.  WHERE C.object_id = OBJECT_ID(@object_name)
  132.  
  133.  ORDER BY C.column_id;
  134.  
  135.  
  136.  
  137.  IF @@ROWCOUNT = 0
  138.  
  139.  BEGIN
  140.  
  141.  RAISERROR(N'can''t found object "%s"', 16, 1, @object_name);
  142.  
  143.  RETURN -1;
  144.  
  145.  END
  146.  
  147.  
  148.  
  149.  DECLARE
  150.  
  151. @temp_proce_name sysname,
  152.  
  153. @sql nvarchar(max),
  154.  
  155. @cmd nvarchar(4000);
  156.  
  157.  
  158.  
  159.  SELECT
  160.  
  161. @temp_proce_name = QUOTENAME(N'##_'
  162.  
  163. + CONVERT(char(10), GETDATE(), 112)
  164.  
  165. + N'_' + CONVERT(char(36), NEWID())
  166.  
  167.  ),
  168.  
  169. @sql = N'
  170.  
  171. CREATE PROC ' + @temp_proce_name + N'
  172.  
  173. AS
  174.  
  175. WITH
  176.  
  177. FIELD AS(
  178.  
  179.  ' + STUFF(@sql_field, 1, 11, N'') + N'
  180.  
  181. ),
  182.  
  183. DATA AS(
  184.  
  185. SELECT * FROM ' + @object_name + N'
  186.  
  187. )
  188.  
  189. SELECT
  190.  
  191. [H1] = N''' + REPLACE(ISNULL(@title, @object_name), N'''', N'''''') + N''',
  192.  
  193. [table/@border] = 1,
  194.  
  195. [tr] = (
  196.  
  197. SELECT
  198.  
  199. <li> = field_name
  200.  
  201. FROM FIELD
  202.  
  203. FOR XML PATH(''th''), TYPE
  204.  
  205. ),
  206.  
  207. <li> = (
  208.  
  209. SELECT ' + STUFF(@sql_body, 1, 2, N'') + N'
  210.  
  211. FROM DATA
  212.  
  213. FOR XML PATH(''tr''), TYPE
  214.  
  215. )
  216.  
  217. FOR XML PATH(''html''), TYPE;
  218.  
  219.  ';
  220.  
  221.  
  222.  
  223.  -- 生成临时处理存储过程
  224.  
  225.  EXEC sp_executesql
  226.  
  227. @sql;
  228.  
  229.  
  230.  
  231.  -- 输出结果到文件
  232.  
  233.  SET @cmd = N'bcp "EXEC ' + QUOTENAME(DB_NAME())
  234.  
  235. + N'.' + @temp_proce_name
  236.  
  237. + N'" queryout ' + QUOTENAME(@file_name, N'"')
  238.  
  239. + N' /T /w';
  240.  
  241.  DECLARE @tb_re TABLE(
  242.  
  243.  col nvarchar(4000)
  244.  
  245.  );
  246.  
  247.  INSERT @tb_re
  248.  
  249.  EXEC sys.xp_cmdshell @cmd;
  250.  
  251.  DECLARE
  252.  
  253. @file_exist int;
  254.  
  255.  EXEC master.sys.xp_fileexist @file_name, @file_exist OUTPUT;
  256.  
  257.  
  258.  
  259.  -- 删除临时存储过程
  260.  
  261.  IF OBJECT_ID(@temp_proce_name) IS NOT NULL
  262.  
  263.  EXEC(N'DROP PROC ' + @temp_proce_name + N';');
  264.  
  265.  
  266.  
  267.  -- 检查文件生成是否成功
  268.  
  269.  IF @file_exist = 1
  270.  
  271.  BEGIN
  272.  
  273.  RAISERROR(N'object "%s" output to "%s" succeed.', 10, 1, @object_name, @file_name);
  274.  
  275.  END
  276.  
  277.  ELSE
  278.  
  279.  BEGIN
  280.  
  281.  SELECT * FROM @tb_re;
  282.  
  283.  RAISERROR(N'some error occur when generate html file, please check output information', 16, 1);
  284.  
  285.  RETURN -1;
  286.  
  287.  END
  288.  
  289.  GO
Copyright © 2000-2022 Lzhdim Technology Software All Rights Reserved