transact sql教程

上传人:第*** 文档编号:30556795 上传时间:2018-01-30 格式:DOC 页数:6 大小:46KB
返回 下载 相关 举报
transact sql教程_第1页
第1页 / 共6页
transact sql教程_第2页
第2页 / 共6页
transact sql教程_第3页
第3页 / 共6页
transact sql教程_第4页
第4页 / 共6页
transact sql教程_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《transact sql教程》由会员分享,可在线阅读,更多相关《transact sql教程(6页珍藏版)》请在金锄头文库上搜索。

1、Transact SQL 教程(一)Transact-SQL编程在下面部分的许多语句都不是 SQL 标准语 句,而是一个叫做 Transact-SQL(T-SQL)的 SQL 扩展的一部分。T-SQL 通过在别的事物上添加一些诸如变量、条件和循环之类的传统编程元素来扩充 SQL。你可能注意到这个问题的唯一原因是你计划使用一种和 Microsoft SQL Server 不同的数据库服务器。在下面部分介绍的语句和技术并不是所有都是可替换的。然而,如果你想全面的利用 Microsoft SQL Server 的性能,你必须使用 T-SQL。在批处理中执行多个语句为了一次能够执行多个 SQL 语句,

2、你可以把它们一起放入一个批处理中。批处理,如同它的名字所隐含的意识一样,是简单的一个或多个 SQL 语句组成的语句组。比如,假如你在 ISQL/w 中输入下面的两个语句,它们就会做为一个批处理而一起执行:SELECT pub_name FROM publishersSELECT pub_name FROM publishers当你执行上面那个简单的批处理时,在表中同样的数据被读取了两次 一个 SELECT 语句读取一次。现在假设你输错了第二个 SELECT 语句中表的名称,并尝试执行下面的语句:SELECT pub_name FROM publishersSELECT ub_name FROM

3、 publishers你可能期望第一个语句能够成功执行,而在执行第二个语句时会发生错误。而实际上并不是这样,在大多数情况下,如果在批处理中有任何一个语句不能成功执行。在其中没有一个语句会执行(特殊情况请看下面的注意)。SQL Server 把在批处理中的语句当成组来看待。注意在一些情况下,一个语句在发生错误时,其他语句仍然能够执行。假如服务器在传递和编译一个批处理时检测到错误,则在批处理中的所有语句都不能执行。假如批处理通过了编译但仍然存在错误,则在其中的某些语句就可能会执行。你可以把一组语句分成隔离的批处理。在 ISQL/w 中,你可以使用命令 GO 来实现该功能。考察下面的语句:SELEC

4、T pub_name FROM publishersGOSELECT ub_name FROM publishers假如你在 ISQL/w 中执行上面的语句。即使在第二个 SELECT 语句中存在错误。第一个语句仍然能够成功地返回答案集。GO 命令强迫 SQL Server 将此二个语句看成两个批处理。给变量赋值SQL Server 具有两种类型的变量:全局变量和局部变量。全局变量是只读的,你不能改变它们的值。然而你可以在多个批处理中接收全局变量的值。局部变量则相反,仅局限于专门的某一个批处理。局部变量的优势在于你可以修改和读取它们的值,在本部分中,你将学习如何使用这两种类型的变量。全局变量全

5、局变量的个数是有限的,你不能自己创建全局变量。两个非常重要的全局变量是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 表中的作者一个唯一的标志,第二

6、列 author_name 用于保留作者的姓名。假定表 Books 同样也具有两列。第一列 book_id 是一个 INT 列,第二列 book_title 是一个具有 VARCHAR 属性的列。在该批处理执行时,Authors 表中标志列的值就会插入到 Books 表的整数列中。这就允许你进行两个表的联合查询。比如,假定你想从两个表中得到作者的姓名和他们的书时,你就可以执行下面的 SELECT 语句:SELECT author_name,book_title FROM Authors,BooksWHERE author_id=book_id对于IDENTITY 变量来说,一个很重要的特征是如

7、果有一个 记录插入了一个没有标志列的表之后,该变量的值就会变成 NULL。例如下面的批处理:INSERT Authors(author_name) VALUES(James Joyce)SELECT IDENTITYSELECT IDENTITYINSERT Books(book_id,book_title)VALUES(IDENTITY,Portrait of the Artist as a Young Man)SELECT IDENTITYSELECT IDENTITY在该批处理执行时,第一个和第二个 SELECT 语句返回 Authors 表中标志列的值。而第三个和第四个 SELECT

8、语句则返回空值,因为在他们之前执行了另一个 INSERT 语句。注意当你要在 Active Server Pages 中接收全局变量的值时,你必须为该变量提供一个列名。比如,为了在 ASP 脚本中接收全局变量IDENTITY 的值,使用如下的语句:SELECT IDENTITY myidentity第二个重要的全局变量是ROWCOUNT,ROWCOUNT 变量记录最近一个语句执行时所影响到的列的数目。为了能够更清晰地了解该变量的工作原理,请看下面的批处理:UPDATE Authors SET author_name=Samel ClemensWhere author_name=Mark Twa

9、inSELECT ROWCOUNTSELECT * FROM Authors Where 1=2SELECT ROWCOUNT在 UPDATE 语 句执行之后, 变量ROWCOUNT 的值等于在数据库中名字为Samel Clement的作者的数目。当最后一个 SELECT 语句执行后,它返回 0 个记录,因此变量ROWCOUNT 的值被置为 0(短句 where 1=2 保证没有记录会返回,因为没有一个记录会满足该条件)你不能创建自己的全局变量同时你也不能给已存在的全局变量赋值。这意味着你不能使用变量在多个批处理之间传递信息。假如你需要存储一些能被多个批处理使用的信息,你必须把信息保存在表中。

10、你并不需要构建所用的数据库非常之大,你只需要创建一些只具有很少几列的小表。在这些表中的每一列都和在传统编程语言中的全局变量的作用非常相似。注意你也可以使用临时表格来模拟传统的全局变量。临时表格是一个特殊的表格,它不永久地存在于数据库中,关于更多的信息,请参看 SQL Server 自带的文档。局部变量在 SQL 中的局部变量和在传统编程语言中的变量非常相似。你可以定义自己的局部变量,并且给他们赋值。对于局部变量而言,最大的局限是他只能存活在定义它的批处理中。下面是使用局部变量的一个批处理例子:DECLARE myvariable INTSELECT myvariable=2+2SELECT m

11、yvariable所用的局部变量都以单个字符开头。在上面的例子中,局部 变量myvariable 首先定义成 INT 类型。然后,使用 SELECT 语句为该变量赋值为 22 。最后一个 SELECT 语句返回该变量的值。在批处理中使用变量之前,你必须首先定义它。你在定义变量时为该变量提供了该变量的名称和他所具有的数据类型。你可以在一个定义语句中定义多个变量。如下所示:DECLARE firstname VARCHAR(20),secondname VARCHAR(20)SELECT firstname=”MARK TWAIN”SELECT secondname=”samnel clement

12、”SELECT firstname=secondname在该批处理中,创建了两个变量:firstname 和secondname。两个变量都定义成VARCHAR 数据类型。下一步,使用 SELECT 语句为变量赋予不同的值。最后一个SELECT 语句把第一个 变量的值赋予另外一个。你也可以把查询结果赋予局部变量,这是一种非常有用的做法。考察下面的批处理:DECLARE queryresults VARCHAR(20)SELECT queryresults=author_name FROM Authors WHERE author_id=1SELECT queryresults在该例子中,变量q

13、ueryresults 赋予一个从 Authors 表中查询所得到的结果。比如:如果 author_id 等于 1 的作者名为 James Joyce。则变量queryresults 的值就是James Joyce。在 Authors 表中使用的标志列用以确保最多只有一个值赋予变量。这就产生了另外两个问题。当你赋予变量一个没有返回值的查询结果时,会发生何种情况?当你赋予变量一个返回多个值的查询结果时,又会发生什么情况?假如一个查询没有返回值,该变量保留它原先的值。当变量第一次定义时,该变量的值为NULL。因此,在前面的例子中,如果没有一个作者的 author_id 为 1,则该变量将会保留值

14、NULL。考 虑下面的例子:DECLARE queryresults INTSELECT queryresults=12SELECT queryresults=author_id FROM Authors WHERE 1=2SELECT queryresults在该例子中,查询确保没有返回结果因为 1 不等于 2。因为没有返回结果,所以变量queryresults 保留它原先的值 12。假如你把一个返回多于一个值的查询结果赋予变量,变量将被赋予最后一个返回的值。比如:假定表 Authors 包含 5 个作者信息。如果在标志列中没有间断,在下面的批处理的最后,变量queryresults 的值将

15、是 5:DECLARE queryresults INTSELECT queryresults=author_id FROM AuthorsSELECT queryresults当你的批处理文件编的越来越大时,你就会发现你会经常的使用局部变量。局部变量在当你需要对多个表格中的数据进行比较时非常的有用。你可以把存储在一个表中的数据存到一个局部变量中,然后和在另外一个表中的数据进行比较。下面就是一个简单的例子:DECLARE queryresults INTSELECT queryresults=author_id FROM AuthorsWHERE 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 写的书。本条目发布于 2007 年 12 月 6 日。属于数据库相关分类。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号