t-sql
百科名片
SQL 程式设计语言的增强版,它是用来让应用程式与 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 7 中新增了许多系统预存程序,如今在 SQL Server 2000 中同样可以利用。表13-1列出了一些可能对您有所帮助的系统预存程序。
表13-1 Procedures Introduced....
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新增与加强的功能」这个主题里找到。
backupfile这个资料表存放在 msdb 资料库中。它记录了所有记录档备份或资料库档案备份的相关资讯。这些资讯包括档案识别码、档案归属的档案群组,以及档案存在的实体磁碟或资料分割的名称。
restorehistory这个资料表存放在 msdb 资料库中。它包含对应於各还原作业相关资讯的资料列,不论是档案的还原或是资料库的还原。这些资讯包括还原的日期与时间、目的资料库、资料回复的时间点以及还原的类型。
sysfiles此资料表为一虚拟资料表,亦即无法直接更新或修改。它包含了每个资料库档案的相关资讯,诸如实体装置及逻辑的档案名称、档案大小及最大档案大小以及资料库增长大小(如果资料库有所增长的话)。
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。
资料指标变数新增了一个 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 与 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 新增与加强的功能」这个主题。
在本节中,我们将讨论 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=。可以指定一个或多个装置,中间以逗号隔开。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
表33-1 RESTORE 命令选项
选项 说明
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'
更改还原档案的位置,例如:MOVE 'Northwind' TO 'D:\data\Northwind.mdf'。如果旧的磁碟无法使用,而需要还原到新的磁碟上时,可以使用这个选项。
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' 指定还原操作进行到标记之前。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
真实世界 使用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
您将再次看到关於还原操作的统计。
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后有个加总列
5。使用grouping区分空值
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