
Достаточно часто на различных форумах появляется вопрос, подобно этому: "...необходимо периодически формировать отчеты по таблицам БД в виде файла html...как реализовать?"
С появлением Reporting Services, задача очень облегчается, но как реализовать эту задачу на T-SQL (без использование и CLR тоже)?
Первый способ-это использование процедур Web Assistant (sp_makewebtask, sp_dropwebtask, sp_runwebtask, sp_enumcodepages).
Наполнять страницу будем результатом запроса
SELECT ID, NAME, XTYPE FROM SYSOBJECTS
Ищем в BOL описание процедур и пробуем построить небольшую html-страничку WebPage.htm на диске С:
EXECUTE sp_makewebtask @outputfile= N'C:WebPage.htm',
@query=N'SELECT ID, NAME, XTYPE FROM sysobjects',
@fixedfont=1, @HTMLheader=3,
@webpagetitle=N'Microsoft SQL Server Web Assistant',
@resultstitle=N'Query Results', @dbname= 'master'
Запускаем, получаем ошибку:
Msg 15281, Level 16, State 1, Procedure xp_makewebtask, Line 1 SQL Server blocked access to procedure ’sys.xp_makewebtask’ of component ‘Web Assistant Procedures’ because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of ‘Web Assistant Procedures’ by using sp_configure. For more information about enabling ‘Web Assistant Procedures’, see “Surface Area Configuration” in SQL Server Books Online.
Оказывается по умолчанию процедуры помощника Web Assistant отключены, включаем их:
sp_configure 'show advanced options', 1;
GO RECONFIGURE;
GO
sp_configure 'Web Assistant Procedures', 1;
GO
RECONFIGURE WITH OVERRIDE
GO
После этого можно запускать наш скрипт. Если получаем ошибку:
Msg 16805, Level 11, State 1, Procedure sp_makewebtask, Line 131 SQL Web Assistant: Could not execute the SQL statement.
Как решить эту проблему, можно прочитать тут: http://support.microsoft.com/kb/834116/en-us (В краце: проблема возникает, если ваш сервер баз запущен под local Windows NT user).
Как только мы разобрались со всеми проблемами, мы можем сформировать нужный нам файл, вот его пример:

А теперь минусы этого способа:
BOL:
В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.. Вместо этого следует использовать службы Reporting Services.
(Кстати в 2008ом я уже не смог найти эти процедуры.) Ну и что ещё смущает:"
Для выполнения процедуры sp_makewebtask необходимо быть членом фиксированной серверной роли sysadmin.
Второй способ мне нравится на много больше. Для формирования html будем использовать XML.
SELECT 2 [@cellpadding] ,2 [@cellspacing] ,1 [@border] ,
(SELECT 'ObjectID' [th], null ,'ObjectName' [th], null ,'XTYPE' [th] FOR XML PATH (''), TYPE) tr ,
(SELECT (SELECT id [text()] FOR XML PATH('td'),TYPE), (SELECT name [text()] FOR XML PATH('td'),TYPE),
(SELECT xtype [text()] FOR XML PATH('td'),TYPE)
FROM master..sysobjects FOR XML PATH ('tr'),TYPE) FOR XML PATH ('table'), TYPE
Полученную строку XML сохраняем в файл WebPage2.htm и смотрим результат:

3ий вариант на Power Shell :
# Определяем запрос к Базе Данных
$Query="SELECT ID, NAME, XTYPE FROM sysobjects"
# Создаём соединение
$SQLConnection = new-object System.Data.SqlClient.SqlConnection("Data Source=(local);Integrated Security=SSPI")
# Создаем SQL команду, используя наш запрос и созданное соединение
$SQLCommand = New-Object System.Data.SqlClient.SqlCommand($Query, $SQLConnection)
# Открываем соединение
$SQLConnection.Open()
# Выполняем….
$SQLAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($SQLCommand)
$DataSet = New-Object System.Data.DataSet;
$SQLAdapter.Fill($DataSet);
$DataTable=New-Object System.Data.DataTable
$DataTable=$DataSet.Tables[0]
#Вывод в HTML
$DataTable.DefaultView | ConvertTo-Html | Out-File "C:\WebPage3.htm"
# Закрываем соединение
$SQLConnection.Close()