T-SQL 即 Transact-SQL,是 SQL 在 Microsoft SQL Server 上的增强版,它是用来让应用程序与 SQL Server 沟通的主要语言。T-SQL 提供标准 SQL 的 DDL 和 DML 功能,加上延伸的函数、系统预存程序以及程式设计结构(例如 IF 和 WHILE)让程式设计更有弹性。
新特色
介绍 T-SQL 的新特色
Transact Structured Query Language 它是ANSI和ISO SQL 标准的Microsoft SQL Server方言或扩展,中文理解为:SQL SERVER专用标准
结构化查询语言增强版。在 Microsoft SQL Server 7.0 中 T-SQL 有着为数不少的新增功能,包括新的预存程序、系统资料表、函数、资料型别、陈述式以及现存陈述式中的选项。这些都被保留在 SQL Server 2000 中,因此我们在这里要先回顾 (特别是在您还不很熟悉 SQL Server 7.0 中 T-SQL 的功能,这个温习就很重要了)。因为有太多的新功能需要讨论,在此我们仅为每个类别举少数例子来加以介绍。
预存程序
系统预存程序
系统预存程序是 SQL Server 提供来执行管理与其他工作,包括了系统资料表更新以及从系统资料表中检索资料等。系统预存程序是和 SQL Server 一起安装,名称以 sp_ (系统预存程序) 或 xp_ (延伸的预存程序)开头。这些预存程序储存在 master 资料库中,权限归系统管理者所有。不过,许多程序可以从使用者自订的资料库执行,用来在特定资料库中从系统资料表检索资讯。当您执行一个系统预存程序,它是在资料库的系统资料表中展开作业。
相关资讯
关於这类型程序的更多相关资讯,请参考《线上丛书》中 「延伸预存程序」 主题。
在 SQL Server 7 中新增了许多系统预存程序,如今在 SQL Server 2000 中同样可以利用。表13-1列出了一些可能对您有所帮助的系统预存程序。
表13-1 Procedures Introduced....
预存描述
系统预存程序 描述
sp_cycle_errorlog 关闭
错误日志档案,重新命名为errorlog.1(以及,如果需要的话,将旧的errorlog.1重新命名为errorlog.2,依此类推),以及开始一个新的错误日志档案。
sp_helpfile 传回与资料库相关之档案的名称与属性。
sp_helpfilegroup 传回与资料库相关之档案群组的名称与属性。
sp_helprole 传回与资料库相关中角色的资讯。
sp_help_alert 报告伺服器定义的警示资讯。
sp_start_job 指示SQL Server代理程式开始执行一个工作。
并不是只有这些预存程序提供立即的资讯,不过它们在使用您的使用者资料库时会相当有用。例如,当执行 T-SQL 指令码并将输出结果储存到一个档案时,提供使用者资讯的程序就会相当有帮助。您可以将 sp_helpfile、sp_helpfilegroup以及 sp_helpdb 的执行结果储存在特定的资料库中,毕竟当您需要重建资料库时有必要了解档案、档案群组、资料库选项在起初建立时的原始设定。在 SQL Server 7.0 新增并保留 SQL Server 2000 中的系统预存程序清单,可以在《线上丛书》「
Transact-SQL新增与加强的功能」这个主题里找到。
系统资料
系统资料表用来储存 SQL Server 中所有资料库的设定资讯,以及物件、使用者和使用者存取权限的定义。每个使用者资料库有各自的系统资料表,其中保存资料库的资讯。只有在 master 资料库的系统资料表才握有伺服器层级的设定资讯。您应该利用系统预存程序来存取系统资料表而不是直接存取系统资料表。关于新的 SQL Server 7.0 新增的系统资料表清单可在《线上丛书》里的「Transact-SQL新增与加强的功能」这个主题里找到。底下列出一些有趣的新系统资料表:
backupfile这个资料表存放在 msdb 资料库中。它记录了所有记录档备份或资料库档案备份的相关资讯。这些资讯包括档案识别码、档案归属的档案群组,以及档案存在的实体磁碟或资料分割的名称。
restorehistory这个资料表存放在 msdb 资料库中。它包含对应於各还原作业相关资讯的资料列,不论是档案的还原或是资料库的还原。这些资讯包括还原的日期与时间、目的资料库、资料回复的时间点以及还原的类型。
sysfiles此资料表为一虚拟资料表,亦即无法直接更新或修改。它包含了每个资料库档案的相关资讯,诸如实体装置及逻辑的档案名称、档案大小及最大档案大小以及资料库增长大小(如果资料库有所增长的话)。
注意
请永远使用系统预存程序来存取系统资料表,系统预存程序提供一层隔离以确保您不会更动到不可更改的资料。如果您以手动方式存取系统资料表,可能会有变更重要系统资讯的风险。
函数
SQL Server 内建的函数提供了一个快速、简单的方法来完成某些特定的工作。SQL Server 7.0 新增了几个有用的函数,并且也包含在 SQL Server 2000 中。了解哪些函数是可用的,SQL Server 应用程式的设计工作可以变得稍为简单。在《线上丛书》中的「Transact-SQL 新增与加强的功能」这个主题可以找到新增函数的完整清单。此处仅介绍一些对您可能很有帮助的函数:
NEWID 建立一个 uniqueidentifier 资料型别的 全域唯一识别项 (GUID)。您需要使用这个函数将值分派给该资料型别的资料行,使用方式为 NEWID 。(此函数不需引数)
YEAR 传回指定日期年份部分的完整整数。使用方式为 YEAR(date) 。例如:以下陈述式 SELECT YEAR('07/11/01') 将会传回值 2007。
MONTH 传回指定日期月份部分的整数。使用方式为 MONTH(date) 。例如:以下陈述式 SELECT MONTH('07/11/01') 将会传回值11。
DAY 传回指定日期日期部分的整数。使用方式为 DAY(date) 。例如:以下陈述式 SELECT DAY('07/11/01') 将会传回值 1。
FILE_NAME 传回档案识别码(ID)的逻辑档案名称。使用方式为 FILE_NAME (file_id_number)。例如:陈述式 SELECT FILE_NAME(4) 档案识别码为4的档案逻辑名称。如果资料库中找不到有此识别码的档案,则传回 NULL。
资料型别
在 SQL Server 7 中新增了几种新的资料型别,一些已经有的资料型别的尺寸也有延伸。此外,SQL Server 2000 新增了三种资料型别,这些资料别多数在 第10章 已经讨论过。此处仅列出 SQL Server 7 有改变,并且也包含在 SQL Server 2000 中的资料型别:
资料指标变数新增了一个 cursor 资料型别。关於指标的相关讯息,请参考《线上丛书》里「Cursors」这个主题。
新增了三种新的 Unicode 资料型别-nchar、nvarchar 以及 ntext。每一个 Unicode 字元使用两个
位元组,并支援所有国际字元。
新增了一种 uniqueidentifier 资料型别,用於储存通用唯一识别码(GUID)。
字元资料和二进位字串的最大长度扩展到8,000位元组。这一长度适用於 char、varchar、binary 以及 varbinary 等型别。
SQL Server 2000 则新增了下列资料型别:
bigint储存8个位元组长度的整数。
sql_variant允许不同资料型别的值储存於同一个资料行。此型别的资料行储存资料本身的值并且加以描述-它的基本型别、小数位数、精确性、最大大小以及定序(collation)。
table运作方式与暂存资料表类似;其宣告包含资料行清单与资料型别。此资料型别可用来定义一个区域变数或是一个使用者自订函数的传回值。
陈述式
SQL Server 7.0 包括了许多新的 T-SQL 陈述式和已经存在陈述式的新选项。同样的,这些也保留在S QL 2000 之中。这些陈述式对应 SQL Server 7.0 的一些新功能。例如,ALTER DATABASE 陈述式包含了下列一些针对档案与档案群组的新选项:MODIFY FILE、ADD FILEGROUP、MODIFY FILEGROUP、REMOVE FILE 以及 REMOVE FILEGROUP。特别是档案群组,新的 DBCC CHECKFILEGROUP 陈述式会检查档案群组中所有资料表的分配和结构的完整性。
SQL Server 7.0 与 SQL Server 2000 包括两个额外的 DBCC 陈述式、DBCC SHRINKFILE 与 DBCC SHRINKDATABASE。前者能缩减资料档案的大小,后者可缩减资料库的所有资料档案并释放未使用的磁碟空间。
SQL Server 7 与 SQL Server 2000 支援一种改进的备份和还原结构。新的BACKUP 陈述式允许全部或部份的资料库备份和记录档备份。新的 RESTORE 陈述式允许使用全部或部份资料库备份和记录档备份来还原。这些代替了 SQL Server 较早版本中的 DUMP 和 LOAD 陈述式。关於 SQL Server 7.0 与 SQL Server 2000 新增陈述式与选项的完整清单,请见《线上丛书》里「Transact-SQL 新增与加强的功能」这个主题。
执行还原
使用 T-SQL 执行还原
RESTORE T-SQL 命令和 BACKUP 命令类似( 第 32 章 中曾经讨论过)。如同BACKUP 命令,第一次使用时可能相当困难,但是一些 DBA 还是喜欢将他们的管理程序放置到 SQL 命令档中,以便於重复执行这些功能。和 BACKUP 命令一样,RESTORE 命令提供了比 Enterprise Manager 更多的附加选项。
在本节中,我们将讨论 RESTORE 命令的语法以及这个命令提供的多种选项。RESTORE 命令有两种形式显示如下:
RESTORE DATABASE 还原完整的资料库、档案或档案群组。
RESTORE LOG 还原交易记录档。
如您所见,所用的命令要依照执行还原操作的类型而定。因为这些命令共用大部分的选项,所以我们稍候将在一个清单中讨论这两种还原类型(资料库和记录档)的所有选项。
RESTORE 陈述式
执行完整资料库还原时 RESTORE 陈述式的语法如下:
RESTORE DATABASE database_name
[ FROM backup_device ]
[ WITH options ]
这个陈述式只要求资料库的档案名称和备份所在的位置。
执行档案和档案群组还原时陈述式的语法如下:
RESTORE DATABASE database_name
[ FILE = file_name ]
[ FILEGROUP = filegroup_name ]
[ FROM backup_device ]
[ WITH options ]
这个陈述式只要求资料库名称、档案名称或档案群组名称和备份所在的位置。
执行交易记录还原时陈述式的语法如下:
RESTORE LOG database_name
[ FROM backup_device ]
[ WITH options ]
就如同其他的命令,database_name 是还原将要执行的资料库名称。backup_device 参数可以是
逻辑备份装置名称或实体装置的名称。如果要指定一个实体装置,必须限定它的装置类型-也就是说,装置名称前面必须加上 DISK=、TAPE= 或 PIPE=。可以指定一个或多个装置,中间以逗号隔开。
如果没有提供 FORM 子句,还原将无法进行,而且仍然会执行回复(除非执行NORECOVERY 选项)。这项技术可以用来将资料库设定为回复模式,而不还原其他附加资料。例如,可以执行多个差异还原操作,然后执行 RESTORE 陈述式,不需要 FORM 子句来将资料库设定为回复模式,就能够启动回复过程。
RESTRICTED_USER 设定新还原资料库的安全性,只有 db_owner、dbcreater 和 sysadmin 角色成员才能存取该资料库。
FILE = file_number 如果在储存媒体中有多个
备份集,可用来识别所使用的备份集。例如设定该数值为2,则使用磁带上的第二个备份集。
PASSWORD = password 指定储存备份的密码。
MEDIANAME =media_name 指定媒体的名称。
MEDIAPASSWORD = password 指定储存媒体的密码。
MOVE 'logical_file_name'
TO 'OS_file_name'
NORECOVERY |RECOVERY |
STANDBY = undo_file
NORECOVERY 指定在还原后,交易将无法退回或重新进行。如果将还原其他的备份(差异式备份或交易记录档备份),则需要用到这个选项。REVOVERY 为预设选项,它指定执行回复操作,并退回每个没有提交的变更。STANDBY 指定在还原需要还原情况下,建立还原(undo)档案。
KEEP_REPLICATION 指定当资料库还原时复制设定要保存下来。
NOUNLOAD | UNLOAD NOUNLOAD 指定在还原完成后不
卸载储存媒体(例如,覆写备份磁带并弹出)。UNLOAD 为预设选项,指定在还原完成后卸载储存媒体。
REPLACE 指出即使资料档案已经存在,SQL Server 仍将还原这些档案。现存的档案将被删除和覆写。如果没有指定 REPLACE,那麼 SQL Server 将会核对 database_name 是否已经存在。如果已经存在,那麼将终止还原操作。这个安全特性帮助避免无意地将还原覆写正在工作的资料库。
RESTART 指定 SQL Server 在还原操作被中断后重新启动还原操作。
STATS [ = percentage ] 在还原操作完成了指定的百分率后显示讯息。如果需要监控操作的过程,这个选项将会很有用。
PARTIAL 指定执行部份还原。
STOPAT = date_time
(log restore only)
指定资料库回复到 data_time 指定时刻的资料状态(只对记录档还原有效)。
STOPATMARK = 'mark' 指定还原操作进行到标记处。
STOPBEFOREMARK = 'mark' 指定还原操作进行到标记之前。
命名交易
命名交易(Named transactions)是 SQL Server 2000 中的新功能。它们是使用命令 BEGIN TRANSACTION ... WITH MARK 的 mark_name 选项建立的,特点是可以使用 RESTORE 命令中的 STOPATMARK 和 STOPBEFOREMARK 功能。
-------------------------------------------------------------------------------
真实世界 使用RESTORE
这里有几个使用 RESTORE T-SQL 命令的例子。
这个陈述式还原 Example 资料库的资料档:
RESTORE DATABASE Example
FROM Backup_Dev_1, Backup_Dev_2
WITH
NORECOVERY,
STATS = 5
GO
这个陈述式还原 Example 资料库的交易记录档:
RESTORE LOG Example
FROM Backup_Dev_3, Backup_Dev_4
WITH
NORECOVERY,
STATS = 5,
UNLOAD
GO
和还原的结果一样,输出将显示操作完成的百分率。将通知还原了多少页面、还原花了多少时间,以及还原执行的速度(MB/sec)。
可用以下的命令回复资料库:
RESTORE LOG Example
WITH RECOVERY
GO
您将再次看到关於还原操作的统计。
数据分组
1.选前几条数据
select top 10 orderid,amt=unitprice*quantity
from ordredetails
order by amt desc
2.利用group by 子句对select命令所选数据分组。分组后可以显示出来
group by是除了不含汇总函数(sum,avg,count,min,max等以外的列)
select prod_id,sum(qty*unit_price) tot_amt
from sale_item
group by prod_id
order by tot_amt desc
3.group by 子句还可以加 with cube语句,加上with cube语句,其返回的数据除了和没有with cube语句一样外,另外它会得到一些加总列。
select sup_id,prod_id ,sum(qty*unit_price),sum(qty) tot_amt
from sale_item
groupby sup_id,prod_id with cube
将有对应每个sup_id的加总列,每个prod_id 的加总列,和null,null全部的加总列
4.with cube语句换成with rollup ,则只返回最高层次的group列(最靠近group by的列的加总)
上面的例子,只返回sup_id的加总列,每个sup_id后有个加总列
cube操作生成的空值null带来一个问题,即如何区分cube操作生成的null值和实际数据中返回的null值。这个问题,可以用grouping函数解决。如果列中的值来自事实数据,则grouping函数返回0,如果列中的值是cube操作所生成的null,则返回1。在cube操作中,所生成的null代表全体值。可将select语句写成使用grouping函数将null替换为字符串all。
因为事实数据中的null表名数据值未知,所以select语句还可以用字符串unknow替代来自事实数据的null。
select productid,grouping(productid),orderid,grouping(orderid),sum(quantity)
from order
group by productid,orderid
with cube
order by productid,orderid
6.group by 子句经常会和having子句搭配,用来找出每个组别中满足指定条件的数据,以下命令由产品文件中找出代码重复者,也就是同一型产品有两家以上的供应商。
select prod_id,count(*) from stock
group by prod_id
having count(*)>1
order by prod_id
实践
创建一个表的时候,必须决定字段定义所要使用的数据类型。数据类型定义了可以存储在一个字段中的数据种类。DBA可以使用数据类型来定义变量和存储过程的输入和输出参数。你必须为每个字段或变量选择一个数据类型以适配于存储在相应字段或变量中的数据。另外,还需要考虑存储需求并选择高效率存储的数据类型。举个例子,想要存储介于0到255的正数时通常要用tinyint替代smallint,int或bigint。这是因为tinyint是一个固定的1字节字段,而smallint为2字节,int为4字节还有bigint为一个8字节的固定字段。
选择正确的数据类型还可以改善
数据完整性。例如,如果为一个日期字段使用datetime数据类型,那么只有日期才能存储在此字段中。然而,如果为此字段使用字符或数字数据类型,那么最终的结果就可以在此字段中存储任何字符和数字类型的数据值,而它们并不代表一个日期。
最后,选择正确的数据类型会带来正确的执行计划,从而改善数据库性能。