给变量赋值
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变量来说,一个很重要的特征是如果有一个记录插入了一个没有标志列的表之后,该变量的值就会变成NULL。例如下面的批处理:
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保证没有记录会返回,因为没有一个记录会满足该条件)
你不能创建自己的全局变量同时你也不能给已存在的全局变量赋值。这意味着你不能使用变量在多个批处理之间传递信息。
假如你需要存储一些能被多个批处理使用的信息,你必须把信息保存在表中。你并不需要构建所用的数据库非常之大,你只需要创建一些只具有很少几列的小表。在这些表中的每一列都和在传统编程语言中的全局变量的作用非常相似。
注意
你也可以使用临时表格来模拟传统的全局变量。临时表格是一个特殊的表格,它不永久地存在于数据库中,关于更多的信息,请参看SQL Server自带的文档。
局部变量
在SQL中的局部变量和在传统编程语言中的变量非常相似。你可以定义自己的局部变量,并且给他们赋值。对于局部变量而言,最大的局限是他只能存活在定义它的批处理中。下面是使用局部变量的一个批处理例子:
DECLARE @myvariable INT
SELECT @myvariable=2+2
SELECT @myvariable
所用的局部变量都以单个@字符开头。在上面的例子中,局部变量@myvariable首先定义成INT类型。然后,使用SELECT语句为该变量赋值为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
在该例子中,第一个SELECT语句用于接收James Joyce的author_id。这样James Joyce的唯一标志列就存储在局部变量@queryresults中。然后该变量就在第二个SELECT语句中的WHERE短句中使用。该SELECT语句通过使用变量来查询在表Books中由James Joyce写的书。