[返回]
中国计算机报2000年第86期数据库的新生代
深入介绍SQL Server 2000的新特性(一)金智利 吕 科
SQL Server 2000(以下简称SQL 2000)包括了许多新特性,这些特性扩展了SQL 2000 作为一种具有丰富开发环境的高性能相关数据库系统的能力,同时对程序设计者和数据库管理者而言,也是必须要了解的。
微软SQL Server 2000大大增进了现今流行的SQL产品的许多功能。在产品的定义上已经做了许多变化,其中包括关系型引擎(Relational Engine)、存储引擎(Storage Engine)、管理和工具、复制、分析服务(OLAP服务和数据采集)、全文查找、与Windows 2000集成化等等。
在本文中,笔者将深入介绍SQL 2000的新特性及应用的注意事项。
■新的数据类型
SQL Server 2000引入了三种新的数据类型,即64位整型数(bigint)、变量(sql_variant)和表格(table)数据类型。
1. 64位整型数(bigint):在数据量越来越大的今天用以往的最大整型int长度231-1来表示整数已显得太不够用, 而FLOAT也不是很合适,所以SQL 2000就有了新的整数类型--bigint。bigint数据类型是一个从-263到263-1整型量。bigint存储长度是8个字节,因此被称为64位整型量。您将使用这种新的整型量,以解决标识符超过先前最大整型量长度的场合。新的bigint数据类型适用的场合与整型数值完全一致,但要注意的是:如果参数表达式是一个bigint数据类型,函数将仅以bigint返回,而SQL 2000将不会自动地使其他整型数据类型(如tinyint,smallint和int等)升级为bigint数据类型。为了便于bigint数据类型的使用,SQL 2000又引入了两个新的内置式函数,即BIG_COUNT和ROWCOUNT_ BIG。这两个函数以一种类似于COUNT函数和@@ROWCOUNT变量的方式进行运算。
2. 变量(sql_variant):熟悉VBScript的人都知道,VBScript使用的是一种叫做variant的数据类型。它可以存放任何数据类型,数字、字符和对象等。SQL 2000里面的sql_variant还没有那么强大的功能,它不能存放blob的数据,如text、ntext和image,还有timestamp,但是已经给编程带来了很大的方便了。sql_variant数据类型能被用于列参数和变量,也能返回用户定义的函数的数值。sql_variant数据类型的运算更象Visual Basic中的变量数据类型,允许一个单个参数或变量存储不同数据类型的数据值。
为了支持sql_variant数据类型,引入了被叫做SQL_VARIANT_PROPERTY的新功能。此函数返回基本数据类型和有关sql_variant实例的其它信息:SQL_VARIANT_PROPERTY(expression, property)。属性参数包括所提供的属性信息的sql_variant属性名。它能取自如下值中的任何一个,即基本类型、精度、数值、总字节、排序(Collation)和最大字长(MaxLength)。
sql_variant数据类型对于由程序管理的元数据(metadata)信息的应用极其有用。例如在一个集中了来自一个Web用户的表格信息的ASP应用程序,当此表格已经被处理、提炼过后,就不再用一个字符变量在数据库中存储表格值和所有相关元数据信息,您所要做的仅仅是以一个sql_variant来存储表格的值。在把变量存入数据库之前,要记住确定此变量:
Dim varName, varAge
varName = CStr(Request.Form("txtName"))
varAge = CInt(Request.Form("txtAge"))
3.表格(table)数据类型:新的表格数据类型是一个局部变量,它可以临时存储一个行集合(rowset),也能返回成一个表格值的函数,此表格数据类型能代替存储在tempdb数据库中的临时表格。因为新的数据类型是在内存中管理,而不是存储在硬盘上,因此大大提高了数据库性能。如果您定义了一个当地表格,您就可以像使用tempdb表格一样的方式使用它,不过它并不支持INSERT INTO… EXEC和 SELECT…INTO语句。为了定义一个当地表格,您通常必须使用带有一个顺序表格定义的DECLARE语句:DECLARE @local_variable TABLE。
■用户自定义函数
在SQL 2000里面,用户可以建立自定义的函数,函数返回值可以是一个值,也可以是一个表。
可能大家还不是太清楚,自定义函数有什么作用。我们知道,为了优化数据库,需要我们尽量避免使用游标,因为这样会带来极大的系统开销。但有时候你必须使用游标,举一个例子,比如我希望得到一个内容是一段汉字字段的拼音。但是要想把汉字转化为拼音,必须通过查表来完成,那么你就必须利用一个游标,然后再对字段中的每一个字进行查表。但是现在我们可以使用自定义函数来完成同样的操作,就极大地节省了系统开销。程序如下:
/*使用自定义函数*/
CREATE FUNCTION Translate ( @Original_Text varchar(100))
RETURNS varchar(500)
AS
BEGIN
DECLARE @intLength as tinyint
DECLARE @strTemp as varchar(10)
DECLARE @strResult as varchar(500)
DECLARE @strChar as varchar(2)
DECLARE @i as tinyint
SET @intLength = len(@Original_Text)
SET strResult = ''
WHILE @i <= @intLength
BEGIN
SELECT @strChar = substring(@Original_Text, @i, 1)
SET @strTemp = null
SELECT @strTemp = spell FROM wordspell WHERE word = @strChar
SELECT @strResult = @strResult + isnull(@strTemp, @strChar)
SELECT @i=@i+1
END
RETURN strResult
END
GO
UPDATE phonecode SET namesame=Translate(name), addsame=Translate(address)
相比利用游标,使用用户自定义函数不但执行效率提高了,代码的可读性也好多了。
■带索引的视图
在以前版本的SQL Server里,视图是不可以有索引的,所以视图一般也就没有什么用处了,除了偶尔用它来做一些权限上的管理以外。查询一个视图和使用一个连接语句在执行效率上没有什么区别。
但是, Microsoft在SQL Server 2000进行了改变,即可以在视图上创建索引。这样,现有的应用程序就可以不再修改而使效率得到很大提高。一般在编程中我们都会用到一些复杂的连接,这样必须在连接的两端加上索引才能获得较好的效率,而且对连接的结果进行排序或者分组也是很慢的,现在一切都不一样了,程序中将不再出现复杂的SQL语句,所有的操作都交给自定义函数、存储结构和视图去完成了,我们只需要在程序中写select from view就可以了,别的事情由数据库管理员去完成。
具体如何在视图上建立索引呢?和给表加索引是几乎一样的,把表名改成视图名就可以了。如果是使用Enterprise Manage,那么建索引或者修改索引的时候,在Grid Pane上面点右键Manage Indexes就行了。