SQL SERVER静态页面导出技术1
类别: 数据库教程
我们在前面对静态页面导出技术进行了初步的介绍,现在我们通过一些实例来完成对它的详细讲解。
静态页面导出可以通过调用存贮过程和使用Enterprise Manager中的向导两种方式来完成。通过向导的方式可以很容易地将数据库的数据导出为静态页面或建立导出任务。使用起来十分方便,但是其的灵活性不如通过调用存贮过程的方法来得好。下面我们首先介绍如何通过向导建立一个静态页面导出。
6.9.4.1. 使用Enterprise Manager进行静态页面导出
假设我们将建立一个静态页面,其内容为每日报纸上刊载的所有文章的题目及其所在版面。而此页面的内容要求每当数据库中的数据发生变化时都能随之发生变化。下面我们来看看其具体的实现过程:
在Enterprise Manager中找到要进行静态页面导出的服务器,打开其Management容器,右击Web Publishing对象。从弹出的快捷菜单中选择New Web Assistant Job选项。将启动静态页面导出的向导(如下图)。
图6.9.4.1-1静态页面导出向导步骤1,提示信息
可以看到,此向导分为三步:定义导出数据、调度导出任务、格式化Web页面。点击下一步继续。
随后将要我们选择要导出的数据来自哪一个数据库,我们选择test后,点击下一步继续(如下图)。
图6.9.4.1-2静态页面导出向导步骤2,选择导出数据库
随后将要求我们输入此导出任务的名称(默认为test Web Page),并选择导出数据的方式(如下图)。
图6.9.4.1-3静态页面导出向导步骤3,选择导出方式
其中有以下三种方式可供选择:
Data from the tables an columns that Iselect:直接从表中选择要导出的字段。
Result set(s) of a stored procedure Iselect:导出的数据来自一个存贮过程的运行结果。
Data from the Transact-SQL statement Ispecify:导出的数据来自一段SQL语句。
根据我们的应用要求,选择第三项之后,点击下一步继续。
随后根据我们选择的导出方式,将要求输入一段SQL语句(如下图)。
图6.9.4.1-4静态页面导出向导步骤4,输入导出查询语句
我们输入如下的一段SQL语句:
select id as \'编号\',banmian as \'版面\',timu as \'题目\'
from gaojian
where kanwu=\'出版报\' and datepart(yy,riqi)=datepart(yy,getdate()) and
datepart(dy,riqi)=datepart(dy,getdate())
输入完成后,点击下一步继续。
随后将要我们对此任务的调度方式进行选择(如下图)。
图6.9.4.1-5静态页面导出向导步骤5,设置导出任务
其中有下面几个选项可供选择:
Only one time when Icomplete this wizard:在完成此向导过程时执行,并且只执行这一次。
On demand:在需要的时候执行。
Only one time at:只在指定的时刻执行一次。
When the SQL Server data changes:当数据库中的数据发生改变时执行。
At regularly scheduled intervals:周期性的执行此任务。
对话框的下部有一个Generate a Web page when the wizard is completed选择框,用来指明是否在此向导过程完成时执行一次页面导出(默认选择此项)。
根据我们的需要,应该选择When the SQL Server data changes一项。点击下一步继续。
接下来的一步根据上一步的选择而会有所不同。我们看到的将是如下图所示的对话框:
图6.9.4.1-6静态页面导出向导步骤6,指定跟踪字段
向导将要求我们选择对哪个表中的哪些字段进行跟踪。一旦表中的这些字段发生了改变(在插入、删除记录及修改记录时),将会运行此任务来更新静态页面的内容。我们选择对gaojian表中的id、riqi、laiyuan和timu四个字段进行跟踪。选择完成后,点击下一步继续。
随后将要我们选择静态页面的存放位置及文件名(如下图)。我们可以将其放在IIS中某一虚拟目录所在的目录下。从而可以让用户通过网页对其进行访问。
图6.9.4.1-7静态页面导出向导步骤7,指定静态文件存放位置
输入合适的存放目录和文件名之后,点击下一步继续。
随后将要对导出页面的格式和编码进行设定(如下图)。
图6.9.4.1-8静态页面导出向导步骤8,指定静态文件的格式和编码
对于页面格式,我们可以让系统自动完成其格式的设定,也可以通过指定一个模板文件来对其进行格式化。后面的内容将对模板文件进行讨论。这里我们现选择由系统自动完成页面的格式化工作。在Use character set下拉列表框中可以对页面的字符集进行选择,由于我们使用中文,所以应该选择简体中文(GB2312)。点击下一步继续。
接下来将要输入页面标题和SQL语句执行结果表的标题并为其选择字体的大小(如下图)。
图6.9.4.1-9静态页面导出向导步骤9,指定静态页面标题
对话框下部的Apply a time and data stamp to the Web page选择框用来决定是否在页面中显示页面生成的日期和时间,从而使用户得知此页面中的数据为何时生成的。设置完成后,点击下一步继续。
随后将对SQL语句执行的结果表进行设置(如下图)。
图6.9.4.1-10静态页面导出向导步骤10,静态页面显示效果设置
其中Yes,display column names和No,display data only单选框用来指明结果表中是否包含字段名(在表头中显示)。根据我们的需要,选择Yes,display column names单选框,显示字段名。而其下的一些选项用于对表中的一些字体效果进行设置。可以选择固定宽度字体(Fixed)、比例宽度字体(Proportional)、加黑(Bold)和斜体(Italic)四种。而Draw border Lines around the HTML table选择框用于指明是否为结果表画出表框。设置完成后,点击下一步继续。
随后将提示是否在页面中加入超链接(如下图)。
图6.9.4.1-11静态页面导出向导步骤11,设置页面超链接
可以有以下三种选择:
No:不在页面中加入超链接。我们选择此项。
Yes,add one hyperlink:加入一条超链接。并为其指明连接和显示信息。
yes,add a list of hyperlink URLs:加入一个超链接列表。此列表是通过一段SQL语句从数据库的某个表中得到的。
选择第一个选项后,点击下一步继续。
接下来我们可以对返回的全部记录的数量和每页返回的结果数量进行限制(如下图)。
图6.9.4.1-12静态页面导出向导步骤12,返回结果数量限制
我们可以选择"No,return all rows of data"单选框,不对返回的总记录数目进行限制;也可以选择"Yes,Return the first rows of data"单选框来对返回的记录数目进行限制(通过在其后的文本输入框中输入要返回的最多记录数)。
选择了"No,put all data in one svrolling page"单选框则意味着所有返回的记录都将被放在一个页面文件之中。而如果选择了"Yes,link the successive pages together"单选框则可以将返回的记录放在许多页面文件中,从而减小结果页面的长度。方便用户对其进行浏览。可以在其后的文本输入框中输入输入每个页面文件所包含最多的记录数目。我们选择每个页面最多可包含20个记录。设定完成后,点击下一步继续。
随后向导将提示我们已经完成了静态页面导出任务的设置,并显示它的一些相关信息(如下图)。
图6.9.4.1-13静态页面导出向导步骤13,完成确认信息
如果点击Write Transact-SQL to file按钮,则可将此任务以一个SQL语言脚本文件的方式保存下来。这样可以在以后通过运行这个脚本来再次建立这个任务。或者对脚本的内容进行修改,对其实现的功能作出一些调整。根据我们的设置,其产生的SQL语句如下:
EXECUTE sp_makewebtask @outputfile = N\'D:testcbbttt.htm\',
@query=N\'select id,banmian,timu
from gaojian where kanwu=\'\'出版报\'\' and
datepart(yy,riqi)=datepart(yy,getdate())
and datepart(dy,riqi)=datepart(dy,getdate())
order by banmian \',
@fixedfont=1,
@colheaders=0,
@HTMLheader=3,
@webpagetitle=N\'Microsoft SQL Server Web Assistant\',
@resultstitle=N\'Query Results\',
@dbname=N\'test\',
@whentype=10,
@nrowsperpage=20,
@datachg=N\'TABLE=gaojian COLUMN=id,timu,laiyuan,riqi\',
@procname=N\'test Web Page\',
@codepage=936,
@charset=N\'gb2312\'
一旦通过向导完成了静态页面导出任务的设定,就不能再通过Enterprise Manager对其属性进行修改。只能使用SQL语句来修改其各项设置。我们将在后面对sp_makewebtask进行讲解时再对其中各个参数的含义进行分析。
点击完成按钮,结束此任务的设置工作。其产生的一个结果页面如下图所示。
图6.9.4.1-14静态页面导出结果
注意:在设置了这个静态页面导出任务之后,如果你在对稿件进行修改、添加或删除的时候,将会出现一个错误提示。如果你关闭了IE的显示友好的HTTP错误信息功能的话(建议在调试IDC应用时关闭此功能,这样就可以看到由系统返回的详细错误信息)就会看到下面的错误信息:
运行查询错误
[State=42000][Error=229][Microsoft][ODBC SQL Server Driver][SQL Server][Microsoft] [ODBC SQL Server Driver][SQL Server]EXECUTE permission denied on object \'test Web Page\', database \'test\', owner \'dbo\'.
[State=37000][Error=16805][Microsoft][ODBC SQL Server Driver][SQL Server]SQL Web Assistant: Could not execute the SQL statement.
这是由于在省缺情况下,定义的静态页面导出的运行权利并不是默认的赋予每个用户。所以当以editer的身份执行IDC时,就会出现权限没有得到许可的错误信息。不过这并不会影响对稿件数据的操作。
解决这个问题有两种方法,一个是修改相应的对稿件进行插入和修改的IDC文件,将其中的Username和password分别改为sa和sa的口令。这样就会以sa的身份运行此IDC文件,从而就不会再出现错误了。而此方法会造成一些安全上的隐患,如果有人读取了这些IDC文件。他就知道了sa的口令,从而可以以sa的身份登录到数据库之中。对数据库可以进行几乎没有限制的操作和修改。为了避免这种情况的发生,可以通过运行下面的SQL语句来授予editers角色对静态页面导出任务的执行权限:
grant all on test.dbo.[test Web Page] to editers
其中test Web Page为此静态页面导出任务的名字,之所以用中括号将其扩起来的原因是它的名字中包含空格。在SQL Server中,凡是名字中包含空格的对象,在引用其名称时都应该用中括号将其括起来。而且对于这些对象,将不能在Enterprise Manager中对其权限等信息进行修改。而只能通过SQL语句来实现。这是由于Enterprise Manager中的一个bug造成的,在SQL Server的SP3中仍然没有得到休正。
虽然通过Enterprise Manager中的向导来建立静态页面导出任务是一个简单的过程,但是对于一些复杂的情况就显得有些不太适用了。比如,假设我们将要把每天出版报的内容放到Internet上通过静态页面进行发布。这样光依靠Enterprise Manager的向导中提供的功能就远远不够了。只能通过调用sp_makewebtask存贮过程并使用一些技巧来来实现这样比较复杂的任务。
静态页面导出可以通过调用存贮过程和使用Enterprise Manager中的向导两种方式来完成。通过向导的方式可以很容易地将数据库的数据导出为静态页面或建立导出任务。使用起来十分方便,但是其的灵活性不如通过调用存贮过程的方法来得好。下面我们首先介绍如何通过向导建立一个静态页面导出。
6.9.4.1. 使用Enterprise Manager进行静态页面导出
假设我们将建立一个静态页面,其内容为每日报纸上刊载的所有文章的题目及其所在版面。而此页面的内容要求每当数据库中的数据发生变化时都能随之发生变化。下面我们来看看其具体的实现过程:
在Enterprise Manager中找到要进行静态页面导出的服务器,打开其Management容器,右击Web Publishing对象。从弹出的快捷菜单中选择New Web Assistant Job选项。将启动静态页面导出的向导(如下图)。
图6.9.4.1-1静态页面导出向导步骤1,提示信息
可以看到,此向导分为三步:定义导出数据、调度导出任务、格式化Web页面。点击下一步继续。
随后将要我们选择要导出的数据来自哪一个数据库,我们选择test后,点击下一步继续(如下图)。
图6.9.4.1-2静态页面导出向导步骤2,选择导出数据库
随后将要求我们输入此导出任务的名称(默认为test Web Page),并选择导出数据的方式(如下图)。
图6.9.4.1-3静态页面导出向导步骤3,选择导出方式
其中有以下三种方式可供选择:
Data from the tables an columns that Iselect:直接从表中选择要导出的字段。
Result set(s) of a stored procedure Iselect:导出的数据来自一个存贮过程的运行结果。
Data from the Transact-SQL statement Ispecify:导出的数据来自一段SQL语句。
根据我们的应用要求,选择第三项之后,点击下一步继续。
随后根据我们选择的导出方式,将要求输入一段SQL语句(如下图)。
图6.9.4.1-4静态页面导出向导步骤4,输入导出查询语句
我们输入如下的一段SQL语句:
select id as \'编号\',banmian as \'版面\',timu as \'题目\'
from gaojian
where kanwu=\'出版报\' and datepart(yy,riqi)=datepart(yy,getdate()) and
datepart(dy,riqi)=datepart(dy,getdate())
输入完成后,点击下一步继续。
随后将要我们对此任务的调度方式进行选择(如下图)。
图6.9.4.1-5静态页面导出向导步骤5,设置导出任务
其中有下面几个选项可供选择:
Only one time when Icomplete this wizard:在完成此向导过程时执行,并且只执行这一次。
On demand:在需要的时候执行。
Only one time at:只在指定的时刻执行一次。
When the SQL Server data changes:当数据库中的数据发生改变时执行。
At regularly scheduled intervals:周期性的执行此任务。
对话框的下部有一个Generate a Web page when the wizard is completed选择框,用来指明是否在此向导过程完成时执行一次页面导出(默认选择此项)。
根据我们的需要,应该选择When the SQL Server data changes一项。点击下一步继续。
接下来的一步根据上一步的选择而会有所不同。我们看到的将是如下图所示的对话框:
图6.9.4.1-6静态页面导出向导步骤6,指定跟踪字段
向导将要求我们选择对哪个表中的哪些字段进行跟踪。一旦表中的这些字段发生了改变(在插入、删除记录及修改记录时),将会运行此任务来更新静态页面的内容。我们选择对gaojian表中的id、riqi、laiyuan和timu四个字段进行跟踪。选择完成后,点击下一步继续。
随后将要我们选择静态页面的存放位置及文件名(如下图)。我们可以将其放在IIS中某一虚拟目录所在的目录下。从而可以让用户通过网页对其进行访问。
图6.9.4.1-7静态页面导出向导步骤7,指定静态文件存放位置
输入合适的存放目录和文件名之后,点击下一步继续。
随后将要对导出页面的格式和编码进行设定(如下图)。
图6.9.4.1-8静态页面导出向导步骤8,指定静态文件的格式和编码
对于页面格式,我们可以让系统自动完成其格式的设定,也可以通过指定一个模板文件来对其进行格式化。后面的内容将对模板文件进行讨论。这里我们现选择由系统自动完成页面的格式化工作。在Use character set下拉列表框中可以对页面的字符集进行选择,由于我们使用中文,所以应该选择简体中文(GB2312)。点击下一步继续。
接下来将要输入页面标题和SQL语句执行结果表的标题并为其选择字体的大小(如下图)。
图6.9.4.1-9静态页面导出向导步骤9,指定静态页面标题
对话框下部的Apply a time and data stamp to the Web page选择框用来决定是否在页面中显示页面生成的日期和时间,从而使用户得知此页面中的数据为何时生成的。设置完成后,点击下一步继续。
随后将对SQL语句执行的结果表进行设置(如下图)。
图6.9.4.1-10静态页面导出向导步骤10,静态页面显示效果设置
其中Yes,display column names和No,display data only单选框用来指明结果表中是否包含字段名(在表头中显示)。根据我们的需要,选择Yes,display column names单选框,显示字段名。而其下的一些选项用于对表中的一些字体效果进行设置。可以选择固定宽度字体(Fixed)、比例宽度字体(Proportional)、加黑(Bold)和斜体(Italic)四种。而Draw border Lines around the HTML table选择框用于指明是否为结果表画出表框。设置完成后,点击下一步继续。
随后将提示是否在页面中加入超链接(如下图)。
图6.9.4.1-11静态页面导出向导步骤11,设置页面超链接
可以有以下三种选择:
No:不在页面中加入超链接。我们选择此项。
Yes,add one hyperlink:加入一条超链接。并为其指明连接和显示信息。
yes,add a list of hyperlink URLs:加入一个超链接列表。此列表是通过一段SQL语句从数据库的某个表中得到的。
选择第一个选项后,点击下一步继续。
接下来我们可以对返回的全部记录的数量和每页返回的结果数量进行限制(如下图)。
图6.9.4.1-12静态页面导出向导步骤12,返回结果数量限制
我们可以选择"No,return all rows of data"单选框,不对返回的总记录数目进行限制;也可以选择"Yes,Return the first rows of data"单选框来对返回的记录数目进行限制(通过在其后的文本输入框中输入要返回的最多记录数)。
选择了"No,put all data in one svrolling page"单选框则意味着所有返回的记录都将被放在一个页面文件之中。而如果选择了"Yes,link the successive pages together"单选框则可以将返回的记录放在许多页面文件中,从而减小结果页面的长度。方便用户对其进行浏览。可以在其后的文本输入框中输入输入每个页面文件所包含最多的记录数目。我们选择每个页面最多可包含20个记录。设定完成后,点击下一步继续。
随后向导将提示我们已经完成了静态页面导出任务的设置,并显示它的一些相关信息(如下图)。
图6.9.4.1-13静态页面导出向导步骤13,完成确认信息
如果点击Write Transact-SQL to file按钮,则可将此任务以一个SQL语言脚本文件的方式保存下来。这样可以在以后通过运行这个脚本来再次建立这个任务。或者对脚本的内容进行修改,对其实现的功能作出一些调整。根据我们的设置,其产生的SQL语句如下:
EXECUTE sp_makewebtask @outputfile = N\'D:testcbbttt.htm\',
@query=N\'select id,banmian,timu
from gaojian where kanwu=\'\'出版报\'\' and
datepart(yy,riqi)=datepart(yy,getdate())
and datepart(dy,riqi)=datepart(dy,getdate())
order by banmian \',
@fixedfont=1,
@colheaders=0,
@HTMLheader=3,
@webpagetitle=N\'Microsoft SQL Server Web Assistant\',
@resultstitle=N\'Query Results\',
@dbname=N\'test\',
@whentype=10,
@nrowsperpage=20,
@datachg=N\'TABLE=gaojian COLUMN=id,timu,laiyuan,riqi\',
@procname=N\'test Web Page\',
@codepage=936,
@charset=N\'gb2312\'
一旦通过向导完成了静态页面导出任务的设定,就不能再通过Enterprise Manager对其属性进行修改。只能使用SQL语句来修改其各项设置。我们将在后面对sp_makewebtask进行讲解时再对其中各个参数的含义进行分析。
点击完成按钮,结束此任务的设置工作。其产生的一个结果页面如下图所示。
图6.9.4.1-14静态页面导出结果
注意:在设置了这个静态页面导出任务之后,如果你在对稿件进行修改、添加或删除的时候,将会出现一个错误提示。如果你关闭了IE的显示友好的HTTP错误信息功能的话(建议在调试IDC应用时关闭此功能,这样就可以看到由系统返回的详细错误信息)就会看到下面的错误信息:
运行查询错误
[State=42000][Error=229][Microsoft][ODBC SQL Server Driver][SQL Server][Microsoft] [ODBC SQL Server Driver][SQL Server]EXECUTE permission denied on object \'test Web Page\', database \'test\', owner \'dbo\'.
[State=37000][Error=16805][Microsoft][ODBC SQL Server Driver][SQL Server]SQL Web Assistant: Could not execute the SQL statement.
这是由于在省缺情况下,定义的静态页面导出的运行权利并不是默认的赋予每个用户。所以当以editer的身份执行IDC时,就会出现权限没有得到许可的错误信息。不过这并不会影响对稿件数据的操作。
解决这个问题有两种方法,一个是修改相应的对稿件进行插入和修改的IDC文件,将其中的Username和password分别改为sa和sa的口令。这样就会以sa的身份运行此IDC文件,从而就不会再出现错误了。而此方法会造成一些安全上的隐患,如果有人读取了这些IDC文件。他就知道了sa的口令,从而可以以sa的身份登录到数据库之中。对数据库可以进行几乎没有限制的操作和修改。为了避免这种情况的发生,可以通过运行下面的SQL语句来授予editers角色对静态页面导出任务的执行权限:
grant all on test.dbo.[test Web Page] to editers
其中test Web Page为此静态页面导出任务的名字,之所以用中括号将其扩起来的原因是它的名字中包含空格。在SQL Server中,凡是名字中包含空格的对象,在引用其名称时都应该用中括号将其括起来。而且对于这些对象,将不能在Enterprise Manager中对其权限等信息进行修改。而只能通过SQL语句来实现。这是由于Enterprise Manager中的一个bug造成的,在SQL Server的SP3中仍然没有得到休正。
虽然通过Enterprise Manager中的向导来建立静态页面导出任务是一个简单的过程,但是对于一些复杂的情况就显得有些不太适用了。比如,假设我们将要把每天出版报的内容放到Internet上通过静态页面进行发布。这样光依靠Enterprise Manager的向导中提供的功能就远远不够了。只能通过调用sp_makewebtask存贮过程并使用一些技巧来来实现这样比较复杂的任务。
-= 资 源 教 程 =-
文 章 搜 索