Использование процедуры sp_makewebtask

ПУБЛИКАЦИИ  

Автор: Забалуев Сергей

По роду своей деятельности я занимаюсь администрированием SQL Server 6.5. и баз данных под его управлением. Не скажу, что это меня напрягает, но бывают случаи когда необходимо получить данные из таблиц. В конечном итоге полученный результат я через буфер обмена помещаю в MS Word и предоставляю его на суд пользователя. Сам незнаю где и когда мне попалась на вид процедура sp_makewebtask. Могу предположить, что это 56 выпуск расылки "MS SQL Server - дело тонкое...". Так вот, я заинтересовался и подумал, а почему бы не посмотреть что из себя представляет эта процедура. Скажу одно-она мне понравилась. Более того, она показалась мне удобной. Надеюсь, что мой труд не пропадет даром и пригодится ходя бы одному администратору

В наш век полного господства Internet перед организациями которые готовы заявить о себе встает вопрос о возможности поместить данные на сервер Internet и сделать их доступными пользователям в любое время и актуальными в любое время. Встает вопрос динамического обновления страниц Web так часто насколько это нужно. Ядро SQL позволяет автоматически генерировать такие страницы на основании данных находящихся в таблице базы данных.
Кроме этого системные администраторы могут воспользоваться данной возможностью и получать отчеты о работе системы в удобночитаемом формате.
В данной статье я рассмотрю возможность использования процедуры sp_makewebtask для создания Web-заданий и ни, словом не обмолвлюсь об альтернативной возможности создать задание используя мастер SQL Server Web Page Wizard.
В самом простом использовании процедура может быть выполнена при указании всего двух параметров: имя выходного файла и текст запроса.

 
USE pubs
GO
EXECUTE sp_makewebtask @outputfile = 'C:\WEB\Test_1.HTM',
@query = 'SELECT title, price FROM titles'
GO

При выполнении этого сценария в каталоге C:\WEB сформируется HTML-файл на основе данных из указанного запроса, который можно просмотреть любым Web обозревателем. Кроме этого замечу, что в параметре @query можно указывать несколько запросов разделенных пробелом. Например,@query='SELECT title, price FROM titles SELECT title FROM titles'. Каждый результат будет разграничен с другим при помощи HTML тэга <HR>.
После выполнения данного сценария просмотрев документ мы можем увидеть, что в качестве заголовка страницы устанавливается заголовок: "Query Results". Для указания своего заголовка служит параметр @resultstitle.
Кроме этого другой параметр @HTMLHeader позволяет указать шесть различных уровней (размеров) для заголовка документа. Значения 1,2,3,4,5,6 идентичны HTML тэгам <H1>,<H2>,<H3>,<H4>,<H5>,<H6>. @HTMLHeader с номером 1 является самым крупным (заголовок верхнего уровня), а с номером 6 - самым мелким.


USE pubs
GO
EXECUTE sp_makewebtask @outputfile = 'C:\WEB\Test_1.HTM',
@query = 'SELECT title, price FROM titles',
@resultstitle='Прайс-Лист',
@HTMLHeader=2
GO

В документе можно увидеть строку последнего обновления страницы. Мы можем управлять ее появлением в документе параметром @lastupdated. Указав в качестве параметра - 0 мы запретим показ даты и времени последнего обновления в сгенерированном документе. По умолчанию принимается значение - 1.


USE pubs
GO
EXECUTE sp_makewebtask @outputfile = 'C:\WEB\Test_1.HTM',
@query = 'SELECT title, price FROM titles',
@resultstitle='Заголовок документа',
@HTMLHeader=2,
@lastupdated=0
GO


Примечание.
Хотя я за то, чтобы в сгенерированной Web-странице была строка, которая показывала бы дату последнего обновления.

Следующие параметры служат для сообщения входной информации, позволяющей получить доступ ко всем таблицам и базам, данные которой должны быть использованы для заполнения страниц. Параметром @dbname определяется рабочая база. Параметром @username определяется пользователь от имени, которого выполняется запрос.
Как мы знаем раздел HTML документа <HEAD> определяет его заголовок. Также мы знаем, что хорошо составленный заголовок может быть весьма полезен. Задачей заголовка является представление необходимой информации для программы, интерпретирующий документ. Также текст, расположенный в заголовке используется поисковыми системами Internet, такими как Yahoo или AltaVista. Для указания заголовка служит параметр @webpagetitle. Указанный заголовок при формировании будет помещен между тэгами <HEAD>, </HEAD>.
Одним из важнейших понятий для HTML-документов являются ссылки. Работая в Web-пространстве, мы часто понятия не имеем, где находится та или иная нужная нам страница. Поэтому ссылки здесь являются единственной возможностью перейти от одного документа к другому. Ссылка состоит из двух частей. Первая из них - это то, что мы видим на Web-странице; она называется указатель ссылки (anchor). Вторая часть, дающая инструкцию WEB-обозревателю, называется адресной частью ссылки (URL-адресом). Когда мы щелкаем мышью по указателю ссылки, WEB-обозреватель загружает документ, адрес которого дается URL-адресом.
Microsoft реализовала возможность указания ссылок при помощи двух парных параметров: [@URL,@reftext] и [@table_urls,@url_query]. Применяется та или иная пара, но не обе одновременно. Первая пара применяется для непосредственного "ручного" указания ссылки. Например:


USE pubs
GO
EXECUTE sp_makewebtask @outputfile = 'C:\WEB\Test_1.HTM',
@query = 'SELECT title, price FROM titles',
@webpagetitle='Практическое применение sp_makewebtask',
@resultstitle='Заголовок документа',
@HTMLHeader=2,
@URL = 'http://www.microsoft.com',
@reftext = 'Microsoft Home Page',
GO

На основе вышесказанного, @reftext это то, что отображается на странице - указатель ссылки, а @URL это адресная часть ссылки. Вторая пара параметров применяется для вывода ссылок на основе SQL-запроса, т.е. указатель и адресная часть ссылки берется из таблицы. В конструкции SELECT при указании полей имейте ввиду, что практически найдут применение только первые два поля. Второе указанное поле берется как указатель ссылки, а первое как адресная часть.
Например:

@url_query='SELECT price,title FROM titles'

Параметр @table_urls позволяет разрешить (1) или запретить (0) включать в документ ссылки из @url_query.


Замечание.
Если @table_urls = 1, то определение параметра @url_query ОБЯЗАТЕЛЬНО.

Следующие параметры относятся к установкам интервалов обновления страницы. К ним относятся: @whentype, @targetdate, @targettime, @dayflags, @numunits, @unittype.
Так как источником информации для страницы является база данных, определение частоты требует определенной работы. Слишком низкая частота обновления увеличит нагрузку на сервер при управлении запросами. Влияние на производительность должно быть минимальным.
Параметр @whentype определяет когда запустить задачу создающую HTML-документ. По своей сути, я считаю, что это "стержень" процедуры sp_makewebtask.

Таблица 1.
Значение
@whentype
Описание
1 Создает страницу сразу. Web задание создано и немедленно удалено после выполнения. (По умолчанию)
2 Создать страницу позже. Сохраненная процедура для создания HTML документа создана немедленно, но выполнение задания задержано до даты и времени, указанной @targetdate и @targettime (необязательный параметр). Если @targettime не определен, задание будет выполнено в 12:00 дня определенного в @targetdate (требуется обязательно указать, когда @whentype=2). Задание будет удалено автоматически, после того как указанная дата и время прошло.
3 Создать страницу каждый n день(ни) недели. HTML документ будет создан в день(ни) указанный в @dayflags и во время указанного @targettime (необязательный параметр), начинающийся с даты указанной в @targetdate. Если @targettime опущен, то значение по умолчанию - 12:00 дня @targetdate(требуется обязательно указать, когда whentype-3). Задания Web, созданные с whentype - 3, не будут удалены автоматически и продолжают выполняться в указанный день (ни) недели, пока пользователь не удаляет их с помощью sp_dropwebtask.
4 Создать страницу каждые n минуты, часы, дни, или недели. HTML документ создается каждый n период времени, начинающийся с даты и времени, указанной в @targetdate и @targettime. Если @targettime не определен, задание Web будет выполнена в 12:00 дня @targetdate. Задание выполняется автоматически каждые n минуты, часов, дней, или недель как определено @numunits и @unittype, и продолжает выполняться, пока пользователь не удаляет их с помощью sp_dropwebtask.
5 Создать страницу по запросу. Процедура будет создана без автоматического планирования задания. Пользователь создает HTML документ, выполняя sp_runwebtask и удаляет это только с помощью sp_dropwebtask
6 Создать страницу сразу и позже. HTML документ будет создан сразу и обновлен, тогда когда см. whentype = 2.
7 Создать страницу сразу и каждый n день (ни) недели. HTML документ создается сразу и обновлен, тогда когда см. whentype = 3 (определять @targetdate в этом случае не требуется)
8 Создать страницу сразу и периодически после создания. HTML документ будет создан сразу и обновлен, тогда когда см. @whentype = 4, (определять @targetdate в этом случае не требуется)
9 Создать страницу сразу и далее по запросу. HTML документ создается немедленно и будет обновлен, тогда когда см. @whentype = 5. Задача должна быть удалена вручную.
10 Создать страницу сразу и тогда когда данные будут изменены. Создает страницу сразу и позже всякий раз, когда данные в таблице будут изменены. При @whentype = 10 требуется указывать @datachg.

Таблица 2.
@whentype Обязательный параметр Не Обязательный параметр
2 @targetdate @targettime
3 @dayflags, @targetdate @targettime
4 @numunits, @unittype, @targetdate @targettime
6 @targetdate  
7 @dayflags @targetdate
8 @numunits, @unittype @targetdate
10 @datachg  

Параметром @targetdate мы определяем дату когда страница должна быть создана, если параметр не указан, то берется текущая дата. Параметр @targettime определяет время когда должно быть создана страница (по умолчанию 12 часов дня). Формат - HHMMSS. @dayflags определяет день недели, чтобы обновить(модифицировать) HTML документ. Параметр может принимать одно из значений :

Таблица 3.
Значение День недели
1 @targetdate
2 @dayflags, @targetdate
4 @numunits, @unittype, @targetdate
8 @targetdate
16 @dayflags
32 @numunits, @unittype
64 @datachg

Кроме этого можно также указывать несколько дней в неделе, в которые необходимо обновить страницу. Для этого необходимо в качестве параметра для @targetdate указать сумму значений всех дней, в которые необходимо обновить страницу. Например, если необходимо обновить страницу в понедельник (2) и четверг (16), то укажем - 18, так как 2+16=18.
@numunits определяет как часто обновлять HTML-документ. Numunits используется только, когда @whentype 4 (периодический) или 8 (сразу и периодически после). Например, если whentype = 4, numunits = 6, и unittype = 1 (часы), указанный HTML документ модифицировать каждые шесть часов. Numunits по умолчанию принимает значение = 1. @unittype определяет, как часто HTML-документ должен быть модифицирован. Используется только, когда @whentype = 4 (периодический), или @whentype = 8 (сразу и позже). Параметр может принимать одно из значений из таблицы 4:

Таблица 4.
Значение Описание
1 (по умолчанию) Час
2 День
3 Неделя
4 Минута

На этом я закончил описание параметров которые могут нам пригодиться при указании частоты перестроения страницы. Рассмотрим следующие параметры не менее полезные. В параметре @procname можно явно указать имя процедуры или Web-задания. Если параметр не определен, то значение будет сгенерированно на основании Web_YYMMDDHHMMSS+<spid>. Если Вы определяете имя самостоятельно, то помните, что оно должно быть уникальным в пределах текущей базы данных. Параметр @maketask определяет, должна ли быть создана задача, чтобы выполнить сгенерированную хранимую процедуру, которая генерирует HTML документ. Параметр может принимать одно из значений из таблицы 5:

Таблица 5.
Значение Описание
0 Генерирует незашифрованную хранимую процедуру, но не создает задачу.
1 Генерирует зашифрованную хранимую процедуру и генерирует задачу.
2(по умолчанию) Генерирует незашифрованную хранимую процедуру и генерирует задачу.

Следующие параметры я отношу к "визуально-оформительским". К ним относятся: @bold, @italic, @fixedfont, @colheaders, @rowcnt. Рассмотрим подробнее. Параметры @bold и @italic позволяют нам указать тип шрифта при выводе результирующего запроса. Он применяется ко всему документу и может принимать два значения: 0/1. По умолчанию = 0.


Замечание. Заголовки столбцов в любом случае = bold.

Параметр @fixedfont позволяет определить вид шрифта на странице. Используется текущий (1) или пропорциональный шрифт (0). По умолчанию = 1.
При помощи параметра @colheaders предоставляется возможность управлять видимостью заголовков столбцов. Может принимать два значения: 0/1. По умолчанию = 1, что указывает на отображение заголовка столбцов.
@rowcnt параметр для определения максимального количества строк, которые мы хотим видеть в сгенерированном HTML-документе. По умолчанию он равен 0, что говорит о том, что в документ помещать все строки из запроса.
@tabborder позволяет определить заключение результата Web-задания в таблицу. Может принимать значение 0/1 (по умолчанию 1).

Следующий параметр @singlerow даже и не знаю кому может понадобиться и для чего. При помощи его мы можем вывести каждую строку результата в отдельном HTML-документе. Если, например, запрос возвратил 10 строк, то будет сгенерировано 10 HTML-документов. Имя файла HTML-документа формируется прибавлением номера строки запроса к указанному нами имени выходного файла в параметре @outputfile. Кроме этого, в конце каждого HTML-документа появляются ссылки навигации, которые позволяют перемещаться по строкам результирующего запроса которые размещены в разных файлах.
@blobfmt позволяет управлять внедрением в генерированный HTML-документ данных полей типа ntext или image (NULL, значение по умолчанию) или сохранением их в другом HTML-документ и связать их с главным HTML-документ по URL. Для размещения данных в другом файле используете формат для @blobfmt:


"%n% FILE=output_filename TPLT=template_filename URL=url_link_name..."

Где n, является номером столбца в списке результата, соответствующему текстовому полю, и n+1 - текст гиперсвязи URL к отдельным данным полей типа ntext или image в HTML файл.


Замечание. Не допускайте наличия пробела перед или после знака (=) и не помещайте имена файлов в кавычки (').

Имена выходных файлов формируются подобным образом как при singlerow=1. Определение @output_filename требуется, но @template_filename и @url_link_name можно опустить. FILE содержит полный путь к расположению выходного файла.
Тот же самый синтаксис в @blobfmt (%n % ФАЙЛ = ...) может быть повторен многократно для полей ntext или image. Если параметр @singlerow определен, то следующий параметр @nrowsperpage не может использоваться. Этот параметр очень похож на @singlerow. Единственное его отличие в том, что в @nrowsperpage мы указываем, сколько строк мы хотим вывести в каждом файле, когда как @singlerow определяет вывод по одной строке в файл. Значение по умолчанию = 0, что указывает на то, что необходимо все строки вывести в одном файле.
Если мы явно определили @whentype = 10, то обязательно необходимо определить параметр @datachg. Формат значения:


{TABLE=name[COLUMN=name]}[,...]

Имя таблицы является обязательным, а список полей - необязательным. При @whentype = 10 будут созданы в указанной таблице триггеры (INSERT, DELETE, UPDATE) на выполнение Web-задания. Если при этом триггеры уже присутствуют, то в конец кода триггера будет добавлен вызов процедуры sp_runwebtask. При условии, что при создании триггера не был применен WITH ENCRYPTION. В противном случае выполнение sp_makewebtask будет невозможным.
Разработка новых спецификаций языка разметки гипертекста (HTML) занимает немалый срок, и за это время компании, производящие WEB-обозреватели, успевают выпустить несколько версий своих продуктов. Поэтому в раздел заголовка HTML-документа может быть добавлен еще один тэг <META>, позволяющий авторам документа определять информацию, не имеющую отношения к HTML. Одним из параметров тэга <META> мы можем управлять с помощью параметра @charset процедуры sp_makewebtask. Мы можем явно указать кодировку текста. Кроме этого мы может через параметр @codepage указать кодовую страницу.


Замечание. Для получении информации о списке кодовых страниц и наборов символов, поддержанных sp_makewebtask можно воспользоваться процедурой sp_enumcodepages Часть результата работы этой процедуры Вы видите ниже.

Все вышеописанные параметры, конечно позволяют получить результат запроса в виде НТML - документа. Но они скорее всего пригодны для "внутреннего" пользования. Там где в первую очередь смотрят не на внешний вид страницы, а на достоверность, оперативность данных. Попробуйте поэкспериментировать с процедурой и ответьте на вопрос : А сможет ли привлечь Ваше внимание эта страница в Internet? Думаю, что нет. В сгенерированной страницы мы не увидим ни логотипа компании, ни рекламных баннеров (а они иногда нужны), ни фона и еще много чего, что позволяет нам язык разметки гипертекста (HTML). Все это было бы так печально на самом деле если бы не последний параметр, который я приберег на последок, @templatefile. Параметр может содержать путь и имя к файлу шаблона, который содержит характеристики форматирования HTML документа. (HTML -файл с тэгами форматирования).
Рассмотрим подробнее. Например, необходимо чтобы в результирующем HTML-документе присутствовал фоновый рисунок. Как быть? Создадим текстовой файл в котором напишем следующий код и назовем его Shablon.tpl (имя и расширение произвольное).

[Shablon.tpl]

    
</HTML%>
</HEAD%>
</TITLE%>sp_makewebtask <//TITLE%>
<//HEAD%>
</BODY BACKGROUND=Back08.bmp%>
<//BODY%><//HTML%>

Теперь выполним следующий запрос:


USE pubs
GO
EXECUTE sp_makewebtask @outputfile = 'C:\WEB\Test_1.HTM',
@query = 'SELECT title, price FROM titles',
@templatefile=' C:\WEB\Shablon.tpl'
GO

Который вернет ошибку :

Server: Msg 16826, Level 11, State 1, Line -1074284106 SQL Web Assistant: Could not find the specified marker for data insertion in the template file.

Данное сообщение ожидаемо, так как в файле шаблона форматирования обязательно наличие метки </%insert_data_here%%> которая определяет позицию в HTML-документе, в которую будет добавлены результаты запроса. Добавим маркер в HTML-файл и снова выполним запрос. Сформируется HTML-документ в котором в качестве фона будет фоновый рисунок. Привлекательность страницы резко возросла, неправда ли?
Хочу заметить, что при определении параметра @templatefile следующие параметры теряют свою силу, просто игнорируются.

Таблица 6.
bold lastupdated table_urls
colheaders reftext URL
fixedfont resultstitle url_query
HTMLHeader singlerow webpagetitle
italic tabborder

Это не страшно, так как синтаксис языка HTML дает нам много возможностей по созданию оригинального, привлекательного шаблона для нашего запроса который мы хотим видеть как Web-страницу.
Добавим в Web-страницу кроме фона еще логотип компании, результат выведем в таблице, которую выравним по центру и визуально оформим. Файл шаблона примет, следующий вид:

[Shablon.tpl]


<HTML%>
<HEAD%>
<TITLE%>sp_makewebtask</TITLE%>
</HEAD%>
-- Фоновый рисунок
<BODY BACKGROUND=Back08.bmp%>
-- Логотип
<IMG SRC=Logo.gif ALIGN=LEFT%>
-- Выравним по центру
<CENTER%>
-- Таблица
<TABLE BORDER=2 BGCOLOR=Beige%>
<TR BGCOLOR=Azure%> <TH%>Title</TH%> <TH%><B%>Price</B%></TH%> </TR%>
<TR%> <TD%> <FONT COLOR=BLUE%> <%insert_data_here%%> </FONT%></TD%>
    <TD ALIGN=RIGHT%><FONT COLOR=RED%> <%insert_data_here%%></FONT%></TD%></TR%>
</TABLE%>
</CENTER%>
</BODY></HTML>

Результат будет неудовлетворять одним. Будет создана таблица содержащая 2 столбца, а результат SELECTа будет помещен в первый столбец ('Title'). Почему и что делать? В этом нам помогут последние два маркера. Это : <%begindetail%> и <%enddetail%>. Они предназначены для более точного размещения данных. Ими необходимо ограничить HTML тэги <TR>, </TR>, <TD>, и </TD>.
Каждая строка в <TABLE> начинается тэгом <TR> (Table Row) и завершается тэгом </TR>. Если строка состоит из двух ячеек, а в нашем случае нам нужны именно две ячейки, то определенную строку мы разобьём на 2 части при помощи тэгов <TD> (Table Data) и </TD>. Для определения заголовка ячеек таблицы используется тэг </TH> (Table Header) и </TH>. Смотрим, что у нас получилось.


<TABLE>
-- определим строку
<TR>
-- первая ячейка
<TD>
-- здесь будут данные поля 'title' нашего SELECT
<%insert_data_here%>
</TD>
-- вторая ячейка
<TD>	
-- здесь будут данные поля 'price' нашего SELECT
<%insert_data_here%>
</TD>
</TR>
</TABLE>

Это были подготовительные действия, и теперь мы дадим команду вставлять данные каждого поля в свою ячейку. Для этого добавим маркеры <%begindetail%> и <%enddetail%> так как я говорил выше. То есть мы ограничим ими тэг </TR> и </TR>. Теперь данные размещены там где мы и предполагали их увидеть. Повторю, Вы имеете полную свободу действий в форматировании Web-страницы использую все доступные возможности языка разметки гипертекста.


<TABLE>
<%begindetail%>
-- определим строку 
<TR>
-- первая ячейка
<TD>
-- здесь будут данные поля 'title' нашего SELECT
<%insert_data_here%>
<TD>
-- вторая ячейка
</TD>
-- здесь будут данные поля 'price' нашего SELECT
<%insert_data_here%>
<TD>
<TR>
<%enddetail%>
<TABLE>


Автор: Забалуев Сергей  2001г.

ПУБЛИКАЦИИ

Скачать электронную карту Ангарска бесплатно
Сайт управляется системой uCoz