标题标题  显示论坛会员列表名单  搜索论坛搜索  HelpHelp
  注册注册  登入登入
ASP教学区
 DoReMe : ASP教学区
主题 话题: 第十二章 高级 SQL 回复发表新主题
作者
贴子内容 << Prev Topic下一个主题 >>
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回复: 103
Posted: 2005/1月/07 9:22上午 | IP记录 引用 bibi

在10章「基础SQL」和11章「中级SQL」中,你已经学习了如何一次执行一个SQL语句。在本章中你将会学习如何一次执行一 组SQL语句。这样你就可以象对传统的编程语言一样对SQL进行处理。在本章中,你将会学会如何创建存储过程,触发器和计划任务 。

首先,你要学习SQL Server Web 助理。该程序能够根据存储在数据库表内的信息自动地创建静态网页。

使用SQL Server Web 助理

在本书的下一部分,你将会学习到如何使用Active Server Pages创建由数据库的信息动态生成的网页。当你需要显示变化迅速的数据库信息时,你必须使用ASP脚本来接收这些信息。然而 在某些情况下,使用ASP脚本显示数据库信息的效率是非常低的。

比如,假设你的网站包含一个具有其它一些网站的目录,有一个网页显示到你喜欢网站连接的列表,比如Yahoo!和Microso ft等。现在假定该网页并不经常改变,最多你在大约一个星期的时间内添加一个新的连接。你可以在有访问者访问此页时通过使用AS P脚本读取存储在数据库表中的连接列表而动态地产生该页。该策略能确保该网页总是能够显示最新的信息。但是,考虑到该网页的内容 并不是经常的变化,该方案并不最优。

Active Server Pages消耗计算机的资源。使用ASP脚本来打开数据库连接和执行查询会花费时间和增加数据库服务器的负担。更进一步,你的处 理器也要为执行脚本而工作。由于在该网页上的内容并不经常改变,所以这些对服务器造成的负担是不必要的。另外,一个更有效的方案 是仅当数据库的内容发生改变时才生成该网页。或者在一定的时间之后生成该网页。该网页并不需要在每一次有人访问此页时进行更新。 你真正需要的是在某一时刻自动地创建该静态网页。

使用SQL Server Web 助理,你可以从数据库表中自动的生成网页。你可以有三种方式来生成网页:一次生成,基于计划或当表内的内容改变时。下一部分将详 细描述如何生成网页。

使用SQL Server Web 助理创建网页

本部分将一步一步的介绍如何使用SQL Server Web 助理。你将学会如何创建显示到你所喜欢网站连接的网页。该网页当表内的数据发生改变时会自动进行更新。

在进行下面的工作之前,你需要创建一个包含你所喜欢网站信息的表。在ISQL/w中执行下面的SQL语句创建该表:

CREATE TABLE site_directory(site_name VARCHAR(30), site_URL VARCHAR(30), site_desc VARCHAR(100))

该网页创建了一个名称为site_directory的表,表中有三列:site_name,site_url和site_de sc。这三列包含了网站名称,URL和对该网站的简单描述。为了自动地根据该表的内容生成显示你喜欢的连接的网页。请按以下五个 步骤进行:

从SQL Server程序组里启动SQL Server Web 助理。该程序在启动时,会要你输入登录信息。输入你的SQL Server名称,你的用户ID,和你的口令。(假如你在使用集成或混合模式,你可以使用信任连接登录)。点击Next按钮进入 下一步。

在该步中,首先出现对话框要你指明如何为该网页选择数据。选中「Enter a Query as Free-Form Text」选项。这时在这些圆形按钮下面就会出现一个空的文本窗口(见图12.1)。选择表site_directory所在的 数据库。在文本窗口中输入如下的SQL语句:

SELECT * FROM site_directory ORDERED BY site_name

该查询语句会读取表site_directory中所有的记录,并把这些结果以字母顺序排列。点击「Next」进入下一步。

图12.1 SQL Server Web Assistant-查询对话框

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在该步中,你要对所采用的计划进行选择。你的选择有:立刻创建网页,稍后创建网页,当数据改变时创建网页,在星期的某一天创建网 页和当某一常规表达式成立时创建网页。在下拉菜单中选中「When Data Changes」。在你做完上面的工作后,就会出现一个在数据库中所有表的列表。在列表中选择表「site_directory 」。这样只有当表「site_directory」的内容发生变化时才创建新的网页。点击」Next」进入下一步。

在本步中,首先会问及有关产生的文件的问题(见图12.2)。使用Favorites.cfm作为你网页的文件名。你必须在文件 名内包含网站目录的路径。一般的,该路径为c:\InetPub\wwwroot\Favorites.cfm。为了定制该网页 ,选中按钮「The Following Information」,输入标题「Favorite Web Sites」做为该网页的标题。输入标头「web site list」做为你查询结果的标头。选中「No」指明你不想包含URL连接和参考文本(这是缺省选择)。点击「Next」进入下一 步。

图12.2 确定文件选项

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

最后一步让你控制网页产生的格式,你可以选择不同的列尺寸,查询结果的格式。最后,你还可以指明该网页是否包含它最后一次生成的 时间,日期。列的标题,查询结果的限制等。不要改变它们的缺省设置,点击「Finish」完成。

HTML文件Favorites.cfm将在表site_directory内的数据发生变化时生成。初始状态下,该文件并不存 在,因为目前该表内的数据并不发生变化。执行下面的SQL语句向表中添加数据:

INSERT site_directory (site_name ,site_URL ,site_desc ) values ( 『Microsoft』 , 』www.microsoft.com 『,』the creator of ASP』)

该语句向site_directory表中添加一条记录。假如你现在查看Web目录,你就会找到文件Favorites.cfm 。在Web浏览器内观看该文件,其结果如图12.3所示。

图12.3 查询结果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SQL Server Web 助理的工作原理

你可能想知道SQL Server Web 助理是如何工作的。你能够选择让该程序基于某计划或当表中的数据发生变化时产生该网页,web助理是如何做到这一点的呢?

SQL Server Web 助理使用了SQL Server 的存储过程、触发器和计划任务。在创建Web页时,该程序使用了三个名称分别为sp_makewebtask,sp_runwe btask和sp_endwebtask三个存储过程。实际上正是这三个存储过程创建了网页。

注意

三个存储过程sp_makewebtask,sp_runwebtask和sp_endwebtask可以不通过SQL Server web助理直接在ISQL/w上执行。

 

为了检测在表中的数据发生变化。SQL Server Web 助理使用了触发器(triggers)。触发器就是一系列的SQL语句,它们在表内的数据进行更新,删除和插入时执行。比如,当 你向表site_directory内插入数据时,一个能产生Favorites.cfm的触发器就会执行。最后为了创建基于计 划的网页,SQL Server web助理使用了计划任务(schedule task)。比如你能够通过web助理按计划每星期重新生成Favorites.cfm文件。为了完成你的任务,web助理会创 建一个计划任务,每个星期定时执行。

本章的余下部分将向你解释如何创建自己的存储过程、触发器、和计划任务。这些能够让你根据客户的行为或时间事件对你的数据表执行 非常复杂的操作。为了能够做到这一点,首先你必须扩充你的SQL知识。允许你像处理传统编程语言一样处理SQL语言。

Back to Top 查看 bibi's 资料 搜索其它贴子 bibi 访问 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回复: 103
Posted: 2005/1月/07 9:23上午 | IP记录 引用 bibi

使用SQL Server Web 助理创建网页

本部分将一步一步的介绍如何使用SQL Server Web 助理。你将学会如何创建显示到你所喜欢网站连接的网页。该网页当表内的数据发生改变时会自动进行更新。

在进行下面的工作之前,你需要创建一个包含你所喜欢网站信息的表。在ISQL/w中执行下面的SQL语句创建该表:

CREATE TABLE site_directory(site_name VARCHAR(30), site_URL VARCHAR(30), site_desc VARCHAR(100))

该网页创建了一个名称为site_directory的表,表中有三列:site_name,site_url和site_de sc。这三列包含了网站名称,URL和对该网站的简单描述。为了自动地根据该表的内容生成显示你喜欢的连接的网页。请按以下五个 步骤进行:

从SQL Server程序组里启动SQL Server Web 助理。该程序在启动时,会要你输入登录信息。输入你的SQL Server名称,你的用户ID,和你的口令。(假如你在使用集成或混合模式,你可以使用信任连接登录)。点击Next按钮进入 下一步。

在该步中,首先出现对话框要你指明如何为该网页选择数据。选中「Enter a Query as Free-Form Text」选项。这时在这些圆形按钮下面就会出现一个空的文本窗口(见图12.1)。选择表site_directory所在的 数据库。在文本窗口中输入如下的SQL语句:

SELECT * FROM site_directory ORDERED BY site_name

该查询语句会读取表site_directory中所有的记录,并把这些结果以字母顺序排列。点击「Next」进入下一步。

图12.1 SQL Server Web Assistant-查询对话框

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在该步中,你要对所采用的计划进行选择。你的选择有:立刻创建网页,稍后创建网页,当数据改变时创建网页,在星期的某一天创建网 页和当某一常规表达式成立时创建网页。在下拉菜单中选中「When Data Changes」。在你做完上面的工作后,就会出现一个在数据库中所有表的列表。在列表中选择表「site_directory 」。这样只有当表「site_directory」的内容发生变化时才创建新的网页。点击」Next」进入下一步。

在本步中,首先会问及有关产生的文件的问题(见图12.2)。使用Favorites.cfm作为你网页的文件名。你必须在文件 名内包含网站目录的路径。一般的,该路径为c:\InetPub\wwwroot\Favorites.cfm。为了定制该网页 ,选中按钮「The Following Information」,输入标题「Favorite Web Sites」做为该网页的标题。输入标头「web site list」做为你查询结果的标头。选中「No」指明你不想包含URL连接和参考文本(这是缺省选择)。点击「Next」进入下一 步。

图12.2 确定文件选项

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

最后一步让你控制网页产生的格式,你可以选择不同的列尺寸,查询结果的格式。最后,你还可以指明该网页是否包含它最后一次生成的 时间,日期。列的标题,查询结果的限制等。不要改变它们的缺省设置,点击「Finish」完成。

HTML文件Favorites.cfm将在表site_directory内的数据发生变化时生成。初始状态下,该文件并不存 在,因为目前该表内的数据并不发生变化。执行下面的SQL语句向表中添加数据:

INSERT site_directory (site_name ,site_URL ,site_desc ) values ( 『Microsoft』 , 』www.microsoft.com 『,』the creator of ASP』)

该语句向site_directory表中添加一条记录。假如你现在查看Web目录,你就会找到文件Favorites.cfm 。在Web浏览器内观看该文件,其结果如图12.3所示。

图12.3 查询结果

 

Back to Top 查看 bibi's 资料 搜索其它贴子 bibi 访问 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回复: 103
Posted: 2005/1月/07 9:23上午 | IP记录 引用 bibi

SQL Server Web 助理的工作原理

你可能想知道SQL Server Web 助理是如何工作的。你能够选择让该程序基于某计划或当表中的数据发生变化时产生该网页,web助理是如何做到这一点的呢?

SQL Server Web 助理使用了SQL Server 的存储过程、触发器和计划任务。在创建Web页时,该程序使用了三个名称分别为sp_makewebtask,sp_runwe btask和sp_endwebtask三个存储过程。实际上正是这三个存储过程创建了网页。

注意

三个存储过程sp_makewebtask,sp_runwebtask和sp_endwebtask可以不通过SQL Server web助理直接在ISQL/w上执行。

 

为了检测在表中的数据发生变化。SQL Server Web 助理使用了触发器(triggers)。触发器就是一系列的SQL语句,它们在表内的数据进行更新,删除和插入时执行。比如,当 你向表site_directory内插入数据时,一个能产生Favorites.cfm的触发器就会执行。最后为了创建基于计 划的网页,SQL Server web助理使用了计划任务(schedule task)。比如你能够通过web助理按计划每星期重新生成Favorites.cfm文件。为了完成你的任务,web助理会创 建一个计划任务,每个星期定时执行。

本章的余下部分将向你解释如何创建自己的存储过程、触发器、和计划任务。这些能够让你根据客户的行为或时间事件对你的数据表执行 非常复杂的操作。为了能够做到这一点,首先你必须扩充你的SQL知识。允许你像处理传统编程语言一样处理SQL语言。

Back to Top 查看 bibi's 资料 搜索其它贴子 bibi 访问 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回复: 103
Posted: 2005/1月/07 9:24上午 | IP记录 引用 bibi

Transact-SQL编程

在下面部分的许多语句都不是SQL标准语句,而是一个叫做Transact-SQL(T-SQL)的SQL扩展的一部分。T- SQL通过在别的事物上添加一些诸如变量、条件和循环之类的传统编程元素来扩充SQL。

你可能注意到这个问题的唯一原因是你计划使用一种和Microsoft SQL Server不同的数据库服务器。在下面部分介绍的语句和技术并不是所有都是可替换的。然而,如果你想全面的利用Microso ft SQL Server的性能,你必须使用T-SQL。

在批处理中执行多个语句

为了一次能够执行多个SQL语句,你可以把它们一起放入一个批处理中。批处理,如同它的名字所隐含的意识一样,是简单的一个或多 个SQL语句组成的语句组。比如,假如你在ISQL/w中输入下面的两个语句,它们就会做为一个批处理而一起执行:

SELECT pub_name FROM publishers

SELECT pub_name FROM publishers

当你执行上面那个简单的批处理时,在表中同样的数据被读取了两次---一个SELECT 语句读取一次。现在假设你输错了第二个SELECT语句中表的名称,并尝试执行下面的语句:

SELECT pub_name FROM publishers

SELECT ub_name FROM publishers

你可能期望第一个语句能够成功执行,而在执行第二个语句时会发生错误。而实际上并不是这样,在大多数情况下,如果在批处理中有任 何一个语句不能成功执行。在其中没有一个语句会执行(特殊情况请看下面的注意)。SQL Server 把在批处理中的语句当成组来看待。

注意

在一些情况下,一个语句在发生错误时,其它语句仍然能够执行。假如服务器在传递和编译一个批处理时检测到错误,则在批处理中的所 有语句都不能执行。假如批处理通过了编译但仍然存在错误,则在其中的某些语句就可能会执行。

你可以把一组语句分成隔离的批处理。在ISQL/w中,你可以使用命令GO来实现该功能。考察下面的语句:

SELECT pub_name FROM publishers

GO

SELECT ub_name FROM publishers

假如你在ISQL/w中执行上面的语句。即使在第二个SELECT语句中存在错误。第一个语句仍然能够成功地返回答案集。GO命 令强迫SQL Server 将此二个语句看成两个批处理。

Back to Top 查看 bibi's 资料 搜索其它贴子 bibi 访问 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回复: 103
Posted: 2005/1月/07 9:24上午 | IP记录 引用 bibi

给变量赋值

SQL Server 具有两种类型的变量:全局变量和局部变量。全局变量是只读的,你不能改变它们的值。然而你可以在多个批处理中接收全局变量的值。 局部变量则相反,仅局限于专门的某一个批处理。局部变量的优势在于你可以修改和读取它们的值,在本部分中,你将学习如何使用这两 种类型的变量。

全局变量

全局变量的个数是有限的,你不能自己创建全局变量。两个非常重要的全局变量是@@IDENTITY和@@ROWCOUNT。@@ IDENTITY变量保留最近一次插入到IDENTITY列的值,如下面的例子:

INSERT Authors(author_name) VALUES(『James Joyce』)

INSERT Books(book_id,book_title) VALUES(@@IDENTITY,』Portrait of Artist as a Yong Man』)

假定表Authors具有两列,第一列是author_id,它是个IDENTITY列。它用于给每个Authors表中的作者 一个唯一的标志,第二列author_name用于保留作者的姓名。假定表Books同样也具有两列。第一列book_id是一 个INT列,第二列book_title是一个具有VARCHAR属性的列。

在该批处理执行时,Authors表中标志列的值就会插入到Books表的整数列中。这就允许你进行两个表的联合查询。比如,假 定你想从两个表中得到作者的姓名和他们的书时,你就可以执行下面的SELECT语句:

SELECT author_name,book_title FROM Authors,Books

WHERE author_id=book_id

对于@@IDENTITY变量来说,一个很重要的特征是如果有一个记录插入了一个没有标志列的表之后,该变量的值就会变成NUL L。例如下面的批处理:

INSERT Authors(author_name) VALUES(『James Joyce』)

SELECT @@IDENTITY

SELECT @@IDENTITY

INSERT Books(book_id,book_title)

VALUES(@@IDENTITY,』Portrait of the Artist as a Young Man』)

SELECT @@IDENTITY

SELECT @@IDENTITY

在该批处理执行时,第一个和第二个SELECT语句返回Authors表中标志列的值。而第三个和第四个SELECT语句则返回 空值,因为在他们之前执行了另一个INSERT 语句。

注意

当你要在Active Server Pages中接收全局变量的值时,你必须为该变量提供一个列名。比如,为了在ASP脚本中接收全局变量@@IDENTITY的值 ,使用如下的语句:

SELECT @@IDENTITY 『myidentity』

第二个重要的全局变量是@@ROWCOUNT,@@ROWCOUNT变量记录最近一个语句执行时所影响到的列的数目。为了能够更 清晰地了解该变量的工作原理,请看下面的批处理:

UPDATE Authors SET author_name=』Samel Clemens』

Where author_name=』Mark Twain』

SELECT @@ROWCOUNT

SELECT * FROM Authors Where 1=2

SELECT @@ROWCOUNT

在UPDATE语句执行之后,变量@@ROWCOUNT的值等于在数据库中名字为』Samel Clement』的作者的数目。当最后一个SELECT语句执行后,它返回0个记录,因此变量@@ROWCOUNT的值被置为0 (短句where 1=2保证没有记录会返回,因为没有一个记录会满足该条件)

你不能创建自己的全局变量同时你也不能给已存在的全局变量赋值。这意味著你不能使用变量在多个批处理之间传递信息。

假如你需要存储一些能被多个批处理使用的信息,你必须把信息保存在表中。你并不需要构建所用的数据库非常之大,你只需要创建一些 只具有很少几列的小表。在这些表中的每一列都和在传统编程语言中的全局变量的作用非常相似。

注意

你也可以使用临时表格来模拟传统的全局变量。临时表格是一个特殊的表格,它不永久地存在于数据库中,关于更多的信息,请参看SQ L Server自带的文档。

 

局部变量

在SQL中的局部变量和在传统编程语言中的变量非常相似。你可以定义自己的局部变量,并且给他们赋值。对于局部变量而言,最大的 局限是他只能存活在定义它的批处理中。下面是使用局部变量的一个批处理例子:

DECLARE @myvariable INT

SELECT @myvariable=2+2

SELECT @myvariable

所用的局部变量都以单个@字符开头。在上面的例子中,局部变量@myvariable首先定义成INT类型。然后,使用SELE CT语句为该变量赋值为2+2。最后一个SELECT语句返回该变量的值。

在批处理中使用变量之前,你必须首先定义它。你在定义变量时为该变量提供了该变量的名称和他所具有的数据类型。你可以在一个定义 语句中定义多个变量。如下所示:

DECLARE @firstname VARCHAR(20),@secondname VARCHAR(20)

SELECT @firstname=」MARK TWAIN」

SELECT @secondname=」samnel clement」

SELECT @firstname=@secondname

在该批处理中,创建了两个变量:@firstname和@secondname。两个变量都定义成VARCHAR数据类型。下一 步,使用SELECT语句为变量赋予不同的值。最后一个SELECT语句把第一个变量的值赋予另外一个。

你也可以把查询结果赋予局部变量,这是一种非常有用的做法。考察下面的批处理:

DECLARE @queryresults VARCHAR(20)

SELECT @queryresults=author_name FROM Authors WHERE author_id=1

SELECT @queryresults

在该例子中,变量@queryresults赋予一个从Authors表中查询所得到的结果。比如:如果author_id等于 1的作者名为James Joyce。则变量@queryresults的值就是James Joyce。

在Authors表中使用的标志列用以确保最多只有一个值赋予变量。这就产生了另外两个问题。当你赋予变量一个没有返回值的查询 结果时,会发生何种情况?当你赋予变量一个返回多个值的查询结果时,又会发生什么情况?

假如一个查询没有返回值,该变量保留它原先的值。当变量第一次定义时,该变量的值为NULL。因此,在前面的例子中,如果没有一 个作者的author_id为1,则该变量将会保留值NULL。考虑下面的例子:

DECLARE @queryresults INT

SELECT @queryresults=12

SELECT @queryresults=author_id FROM Authors WHERE 1=2

SELECT @queryresults

在该例子中,查询确保没有返回结果因为1不等于2。因为没有返回结果,所以变量@queryresults保留它原先的值12。

假如你把一个返回多于一个值的查询结果赋予变量,变量将被赋予最后一个返回的值。比如:假定表Authors包含5个作者信息。 如果在标志列中没有间断,在下面的批处理的最后,变量@queryresults的值将是5:

DECLARE @queryresults INT

SELECT @queryresults=author_id FROM Authors

SELECT @queryresults

当你的批处理文件编的越来越大时,你就会发现你会经常的使用局部变量。局部变量在当你需要对多个表格中的数据进行比较时非常的有 用。你可以把存储在一个表中的数据存到一个局部变量中,然后和在另外一个表中的数据进行比较。下面就是一个简单的例子:

DECLARE @queryresults INT

SELECT @queryresults=author_id FROM Authors

WHERE author_name=」James Joyce」

SELECT book_title FROM Books WHERE author_id=@queryresults

在该例子中,第一个SELECT语句用于接收James Joyce的author_id。这样James Joyce的唯一标志列就存储在局部变量@queryresults中。然后该变量就在第二个SELECT语句中的WHERE短 句中使用。该SELECT语句通过使用变量来查询在表Books中由James Joyce写的书。

Back to Top 查看 bibi's 资料 搜索其它贴子 bibi 访问 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回复: 103
Posted: 2005/1月/07 9:24上午 | IP记录 引用 bibi

在屏幕上显示数据

一般的,当你在执行批处理时并不需要在屏幕上打印任何结果。然而在你调试一组SQL语句时,PRINT语句就能派上用场。下面就 是PRINT语句的一个简单例子:

DECLARE @myvariable VARCHAR(30)

SELECT @myvariable=」Hello There!」

PRINT @myvariable

你不能使用PRINT语句在屏幕上打印除字符类型以外的其它数据类型。假如你需要打印其它的数据类型,你首先必须使用CONVE RT()函数来转化他们。比如:

DECLARE @myvariable VARCHAR(10),@mynumber INT

SELECT @mynumber=12

SELECT @myvariable=CONVERT(VARCHAR(10),@mynumber)

PRINT @myvariable

在上面的例子中,变量@mynumber首先赋值12。但是你不能直接打印该变量,因为该变量的值并不是字符类型。CONVER T()函数用于把该值转化成VARCHAR数据类型,这样它就能够打印了。

技巧

假如你仅仅是因为调试的原因而观看变量的值,你可以使用SELECT语句而不是PRINT语句。使用SELECT语句,你并不需 要把一个变量转换成字符类型。

Back to Top 查看 bibi's 资料 搜索其它贴子 bibi 访问 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回复: 103
Posted: 2005/1月/07 9:25上午 | IP记录 引用 bibi

注释你的SQL语句

当你的SQL语句集合变得越来越大而非常复杂时,你需要对你的语句进行注释。你可以使用两种方法在你的语句中添加注释。假如你需 要添加单行的注释时,你可以在一行后使用两个连字符,如下所示:

DECLARE @myvariable DATETIME

SELECT @myvariable=GETDATE() –Gets The Current Date

SELECT @DATENAME(dw,@myvariable)—Gets The Day of the Week

当你使用双连字符时,在双联字符后面到本行的结尾之间部分全是注释。为了创建一个多行的注释,你需要把注释包含在字符/*和*/ 之间,如下所示:

DECLARE @myvariable DATETIME

/* The following statements retrieve the current date and time and extract the day of the week from the results.

*/

SELECT @myvariable=GETDATE()

SELECT DATENAME(dw,@myvariable)

注释对文档的代码而言没有任何用处;他们只在调试程序时有用。假如你想临时让一部分的SQL语句失去效用,你可以简单的使用注释 符号包含它们。当你准备再次包含这些语句时,你只需要删除注释符号。

用条件控制语句的执行

当你想根据某些条件来执行一个或多个SQL语句时,你需要使用conditional,请看下面的例子:

IF (SELECT COUNT(*)FROM Authors) >10 PRINT 「More than 10 Authors!」

假如在表Authors中有多于10个的作者,该语句就会打印More than 10 Authors!结果。

注意

仔细观看该条件语句的结构。注意到缺了什么?这里没有THEN语句。假如你在条件语句中包含了THEN,就会产生错误。

你可以创建一个可以执行一块语句的条件判定。只需要把你要执行的这块语句包含在关键字BEGIN和END中:

IF DATENAME(mm,GETDATE())=」July」

BEGIN

PRINT 「It is July」

PRINT 「Happy July」

END

假如你在执行该批处理时刚好是7月份。则包含在BEGIN和END中的语句将会执行。

同样的,你还可以嵌套IF语句,如下面的例子所示:

IF DATENAME(mm,GETDATE())=」July」

BEGIN

PRINT 「It is July」

PRINT 「Happy July」

IF DATEPART(dd,GETDATE())=4

BEGIN

PRINT 「And it is the 4th」

PRINT 「Happy 4th of July」

END

END

假如在你执行该语句时恰好是7月4号,则在内层的语句块也将会执行。下面就是你执行的结果(如果你是在7月4号执行该批处理的话 )

It is July

Happy July

And it is the 4th

Happy 4th of July

使用关键字ELSE和IF语句一起使用,可以创建逻辑上与判断语句相反的代码。下面的例子在星期五执行时打印It is Friday!,而在其它时间执行时打印Some other day。

If DATENAME(dw,GETDATE())=」Friday」

PRINT 「It is Friday」

ELSE

PRINT 「Some other day」

最后你可以在条件语句中使用关键字EXISTS来判断查询是否返回结果。下面的例子就使用EXISTS语句来判断作者James Joyce是否在表Authors中:

IF EXISTS(SELECT author_name FROM authors WHERE author_name=」James Joyce」)

PRINT 「James Joyce is an author」

ELSE

PRINT 「James Joyce is not an author」

Back to Top 查看 bibi's 资料 搜索其它贴子 bibi 访问 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回复: 103
Posted: 2005/1月/07 9:25上午 | IP记录 引用 bibi

使用CASE控制语句执行

假设你想在网页上显示你喜欢站点的名称,URL,和关于它的简单描述。更进一步,你想在列出这些站点时在站点的名称旁边指明每一 个网站的类型。比如,在政府机关网站的旁边,你会显示单词Government;在商业网站的旁边,显示单词Commercia l。为了做到这一点,你可能会创建一个具有4列的表。前三列和原先的一样,分别是名称列,URL列,简单描述列。另外你可能会添 加一个新列,该列为每一个网站的类型。

但在实际上,你不需要这样做…有一种能获得同样的结果但是更好的方法。

按照上面的做法,你的数据表中就会包含多余的信息。因为在URL列中已经包含了每一个网站类型的信息。通过查看每一个URL最后 的三个字母,你就能确定某个网站是商业的,政府的和教育的等等。所以你不需要在数据表中添加新列重复同样的信息。但是当你在读取 数据表中的记录时你是如何在URL列中获取该信息的呢?你可以使用CASE表达式来做到这一点。如下面的例子所示:

SELECT

CASE

WHEN site_url LIKE 「%edu」 THEN 「Educational」

WHEN site_url LIKE 「%gov」 THEN 「Government」

WHEN site_url LIKE 「%com」 THEN 「Commercial」

ELSE 「Other」

END

) 「TYPE」,

site_name 「Name」,

site_URL 「URL」,

site_desc 「Description」

FROM site_directory

 

注意

字母.edu,.gov,和.com都是顶级域名的例子,目前还有许多的顶级域名在使用,比如,假如某个网站的域名以字母.cn 结尾,这就指明该网站建在中国大陆。

当上面的SELECT语句执行时,你就会接收到正确的结果。为了返回正确的值,我们使用CASE表达式对site_url列进行 了检测。比如,当site_url列的值以三个字母edu结尾时,就会返回值Educational。下面就是从该查询返回结果 的一个例子:

Type
 Name
 URL
 Description
 
……………..
 ………………
 厖厖厖
 厖厖厖
 
Commercial
 Microsoft
 www.microsoft.com
 The Creators of Active Server Pages
 
Commercial
 Yahoo
 www.yahoo.com
 One of the best Internet Directories
 
Commercial
 Collegescape
 www.collegescape.com
 Apply to over 50 colleges online
 
Educational
 MIT
 www.mit.edu
 The Massachusetts Institute of Technology
 
Government
 The whitehouse
 www.whitehouse.gov
 The residence of the Prisedent
 

使用CASE语句,你可以测试不同的条件,并且基于不同的结果返回不同的值。对于每一个测试,都有对应的WHEN短句。在该例子 中,当在WHEN短句后面的语句为真时,返回在相应的THEN短句后面的值。如果没有一个WHEN短句后面的语句为真,则返回在 ELSE短句后面的值。

所有的多个WHEN短句和可以选择的单个ELSE短句都必须包含在表达式CASE和END之间。关键字CASE指明CASE语句 的开始。而关键字END指明CASE语句的结束。

CASE语句具有另外一种稍微不同的格式。考察在下面的例子内是如何使用CASE语句的:

SELECT

(CASE

site_name

WHEN 「Yahoo」 THEN 「Internet Directory」

WHEN 「Microsoft」 THEN 「Software Giant」

ELSE 「Other」

END

)」Type」,

site_name 「Name」,

site_URL 「URL」,

site_desc 「Description」

FROM site_directory

该例子同样显示网站列表的类型,名称,URL和简要描述。所不同的是,在该例子中,每个网站的类型是由网站的名称决定的,而不是 URL。下面就是该批处理的结果:

Type
 Name
 URL
 Description
 
Software Giant
 Microsoft
 www.microsift.com
 The Creators of Active Server Pages
 
Internet Directory
 Yahoo
 www.yahoo.com
 One of the best Internet Directories
 
Other
 Collegescape
 www.collegescape.com
 Apply to over 50 college online
 
Other
 MIT
 www.mit.edu
 The Massachusetts Institute of Technology
 
Other
 The whitehouse
 www.whitehouse.gov
 The residence of the President
 

(5 row(s) affected)

请注意在该例子中,CASE例子是如何书写的。在该CASE语句中,在WHEN短语后面并没有跟一个语句,而是要与site_n ame列的值相比较的值。

当你具有多个条件且每一个条件都是可真或可假时,你必须使用第一种CASE语句格式。假如你需要把一个值和多个值比较时,则使用 第二种格式。

Back to Top 查看 bibi's 资料 搜索其它贴子 bibi 访问 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回复: 103
Posted: 2005/1月/07 9:25上午 | IP记录 引用 bibi

使用RETURN语句从批处理中返回

为了从批处理中退出,你可以使用RETURN语句。考察下面的例子:

IF DATENAME(dw,GETDATE())=」Saturday」

BEGIN

PRINT 「It is Saturday」

RETURN

END

PRINT 「It is some other day」

当该批处理在星期天执行时,在条件语句后面的语句块就会执行。当碰到RETURN语句时,该批处理立即就退出了。这也意味著下面 的语句仅仅在不是星期天的某一天显示:

It is some other day

Back to Top 查看 bibi's 资料 搜索其它贴子 bibi 访问 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回复: 103
Posted: 2005/1月/07 9:25上午 | IP记录 引用 bibi

把语句组入到事务中

假如你想在你的网站上出售商业卡。首先,为了做到这一点,你必须创建两个表格,一个表格包含了要付帐的信用卡帐号的列表。另外一 个表则包含了定购产品的定单的列表。无论何时,当一个客户在访问你的站点时定购了商业卡,你需要把信息同时添入到两个表格中。

现在假设有一个访问你站点的客户定购了商业卡。首先该客户的信用卡号添加到信用卡表中。然而就在这一时刻。你Web服务器的硬盘 驱动器突然坏了。该客户的定单并没有保留到产品定单表中。这就会使事情变得很糟糕。来访者的信用卡为商业卡付了账,但是确没有收 到定购的产品。此时定购的客户肯定会对你的行为感到生气。你该怎样阻止该事情的发生呢?

在本节中,将会用到下面的三个语句:BEGIN TRANSACTION,COMMIT TRANSACTION和ROLLBACK TRANSACTION。一个事务(transaction)是一组语句,这组语句要么全部执行,要么全部不执行。下面就是如何 使用这些语句的一个简单的例子:

BEGIN TRANSACTION

INSERT credit_cards (username,ccnumber)

VALUES(『Andrew Jones』,』5555-55-555-55-5555』)

INSERT orders(username) VALUES (『Andrew Jones』)

COMMIT TRANSACTION

在该例子中,我们使用BEGIN TRANSACTION 和COMMIT TRANSACTION来定义事务块.在该块中显示的语句只有在执行COMMIT TRANSACTION后才发生效用。假如在到达该语句之前的任一点发生了错误,所有在该事务中的语句都不会发生效用。比如在上 面的例子中,如果你的硬盘在执行完第一个INSERT语句而在第二个语句之前发生了硬盘错误。没有数据会插入到任一表中。第一个 语句会倒转回去,并不会有如何效果。

你可以使用ROLLBACK TRANSACTION语句来显式地倒转一个事务,如下所示:

BEGIN TRANSACTION

INSERT credit_cards(username,ccnumber)

VALUES(『Andrew Jones』,』5555-55-555-55-5555』)

INSERT orders(username) VALUES(『Andrew Jones)

IF DATENAME(dw,GETDATE())=」Tuesday」

ROLLBACK TRANSACTION

ELSE

COMMIT TRANSACTION

在上面的例子中,事务在除了星期二外的每天都递发。假如一个星期中的某一天刚好是星期二,则事务就会倒转回去,不会产生任何效果 。换句话说,在在星期二不会收到任何新的定单。

注意

在和触发器一起使用时,ROLLBACK TRANSACTION命令特别有用。参看下面的「结合触发器和事务过程」部分。

Back to Top 查看 bibi's 资料 搜索其它贴子 bibi 访问 bibi's
 

of 2 下一页 >>
  回复发表新主题
显示可打印的页面 显示可打印的页面

论坛跳转
不能 张贴新论题在这个讨论版
不能 回应论题在这个讨论版
不能 删除你的发言在这个讨论版
不能 编辑你的发言在这个讨论版
不能 新增投票标题在这个讨论版
不能 在这个讨论版投票

Edit by doreme Forums version 2004
Welcome ©2001-2004 doreme Guide

This page was generated in 0.1836 seconds.

 
保养品
保养品, Skin Care
www.elady.tw
美材批发
美材, Cosmetic
www.elady.tw/beauty_org
保养品批发
名牌保养品、保养品批发
gb.perfume.com.tw/skincare
饰品批发
饰品、饰品批发
gb.perfume.com.tw/ornament