SQL Server 2000程序员指南8.4嵌入式SQL数据厍访问过程…2428.5SQL命令执行方式24886嵌入式SQL近项设置..2528.7建立嵌入式SQL应用程序∴...….25288小结第一部分 Transact-SQL编程木部分主要讨论 Microsoft SQL Server的 Transact-SQL程序设计技术。Transact-SQL是结构化查询语言(SQL的扩展,而SQL是关系数据库语言的工业标准。SQL语言分两种:一是用于定义关系数据库的数据,叫做数据定义语言(DDL),二是用亍操纵关系数据库中的数据,叫做数据操纵语言(DML)本部分将分别讨论DDL和DML设计技术。第1章 Transact- SQL DDL在 Transact-SQL语言中,DDL(数据定义语言)是棊础,因为它负责各类数据厍对象的创建和删除。本章主要介绍下列四个基本DDL语句: Create Database、 Create table、 CreateView和 Create index,以及删除这些语句创建的对象: Drop Database、 Drop Table、 Drop View和 Drop Index创建数据库在SQL术语中,数据库是一个容器,包含了相关的基表、视佟、索引、存储过稈和其他对象。在创建这些对象之前,必须有个仔储它们的数据库。在数据斥中,对象被进步组织为有一个所有者。对于某些类型的对象,例如表,只要属于不同的用户,就可以在冋一个数据库中有同样的名称,然而,对于产品系统最好不要出现重复的名称。一般情況,大多数产品对象由数据库所有者拥有为了创建数据库,用户必须是系统管理炅或者被授权使用 Create database语句。 CreateDatabase命令最简单的形式如下Create Database AppDta这条语句创建 AppDta数据库,并且把 SQL Server的 model数据库定义复制到新数据库中。也就是说, model数据库中的每一个表、视图、存储过程等等的空拷贝都复制在新数据库中创建。 SQL Server为这个数据厍创建两个 NT Server文件: appdta.mndf保存数据,appdta_log.df保存事务口志的內容。这两个文件的默认初始大小分别设置为 model数据斥的主文件和日志文件的大小。如果需要, SQL Server将自动扩展这些文件。1.1.1指定位置和大小如果希望为数据库或事务日志指定一个或者多个特定文件,增加一个On子句,列出个或者多个文件,并可为分配这个文件的空间(以MB为单位)指定一个可选值,例1-1说明了创建数据库的基本语句。例l-1Create Database AppDtaOn PrimaryNameAppEal,Filenamec: \prcduction data\ appdtal mdf',SiZMaxsizeOOMBFileGrowth0M)Fi⊥ enamec:、 productin:\data、 appia1.ndfSizeOMB,FileGrowthOMBOn关键字之后的第一项应该指定叫选的 Primary关键宇,表明这是一个主文件,它包含该数据库的系统表和初始化信息。指定的其他从属文件用于保存在用户表和其他对象中的数据。在这个示例中的参数如下Name SQL Server使用的逻辑名称Filename完全限定的 NT Server文件名Size文件的初始大小,默认值是 model数据库主文件( model.mdf)的大小● MaxSize最人的文件尺寸,默认值是占满整个空间·Hile( Growth当需要时, SQL Server扩展文件的量。默认值是10%个 SQL Server数据库可以超过一百力TB大小1TB=100MB为了提高性能和可恢复性,可以使用 Log On子句来指定数据库的 SQL Server将事务日志存储在·个与数据库对象不同的设备上,如例1-2。例1Create Database AppDta01Pr⊥[niFi1∈are=C: \Production、 date\appdta1.mdf′,MaxsizeOOMEFilegrowthAppDta2FilenameNC: \Producticn\date\appdtal mdf/Size0NamcpUtlog lFilenamed: \producticn\og\ appdtalogl Idf '这种方式,如果数据库所在的物理设备被破坏,日志还可以使用(如果该日志所在的设各没有被破坏)。使用一个以前的数据库备份和一个未破坏的日志的脱机拷贝,可以将数据库恢复到保存数据库恢复的设备失败时的状态。当指定明确的文件时,按照 SQL Server的约定,使用mdf作为数据库主文件的扩展名,ndf作为数据库从属文件的扌展名,Jdf作为事务日志文件的扩展名。1.1.2修改数据库在薮据斥创建之后,可以使用 Alter Database语句增加新文件、删除已有的文件或修改文件的设置。例1-3的语句可增加一个新文件:例Alter Database pepitaAdd Filei NameppTa,Fileanme:\producticn\data\appdta3 ndf,Siz=-0M,Fi⊥eG≌owth还有一个 Add Log file子句,它与 Add file子句有相同的格式。 Remove file子句只使用以前指定的逻辑文件名Alter Database AppDtaRer。veFi1 e appIa2Modify File子句需要以前指定的逻辑文件名,并且可以带任何其他的参数,例如,参数 File growthA⊥ cer database AppdtaModiFy fileNameAppEal,FileGrowth=5OMB1.1.3定义文件组数据库文件(不包括事务日志文件)可以组成文件组。最初创建一个数据库时,该数据斥的默认文件组包含了主文件和没有明确分配给用广定义文件组的从属文件。在许多情沉下,默认的文件组已经足够了。对于有些系统,在指定的设备上创建用户定义的文件组,可以提高数据库性能或可恢复性。因为可以指定表或索引所在的文件组,所以文件组提供种间接手段,可以把表和索引放在指定的设备上。另外,当使用一个包含了许多文件的文件组时, SQL Server根据文件可用的自由空间,把文件组中的数据按比例散布在文件中。下面是个创建文件组的示例:Alter Database AprDtaAdd FilcGrouup mopltaGroupl当创建一个文件组之后,可以使用 Alter Database语句把新文件增加到该文件组中。对于那些增加到用户定义的文件组中的文件,一般应该指定一个与该数据库主文件不同的设各,如例1-4例14Altcr Dacabasc ArpDtaAdd File(NFilenamed: production\data\ apppdta2 rdfSizeMaxsize=00MR,FileGrowthOMB)INameAppDta3,Filenamed: \production\data\appdta3 ndf17∈FileGrowth0M3)To FiLeGroup AppDtaGroupl为了删除文件组和文件组所包含的文件,可以使用类似下面的语句Alter Database AppDtaRemove Fl⊥eAplAlter Database AppDtRer。veFi⊥ e appia3Alter Database App DtaRcr。vc上i1 cGroup ArpDtaG在删除文件或者文件组时,它们必须为空。也可以使用 Alter database语句改变某个数据库的默认文件组,例如下面的语句:Alter DatabModify FileGroup AppDtaGroupl Default2创建表在关系数据库中,基表包含了实际的数据。在一个 SQL Server数据库中,可以创建多达两万亿个表。为了用SQL创建表,输入一条 Create Table语句,指定下述内容包含表的数据库表的所有者表名,在同一个数据库中和同一个所有者下,该表名必须与仟何其它基表或视图不同●指定1到1024个列主键约束(可选)1到250个 Unique约束可选)1到253个外键约束(可选)·1个或者多个 Check约束,限制插入表中的数据(可选)●存储表的文件组(可选)1.2.1创建表的一般要求例1-5示意了一个比较复杂的 Customer表的 Create Table语句。正如例1-5所示, Create table语句首先指定将要创建的表,然后列出列和约束的定义,之间由逗号分开,用组括号括住。SQL是种自由格式的语言,条语句可以放在多行上,在字和符号之间使用空格,以提高可读性。该小例说明代码样式:代码以每个列的定义开始,约束单独占一行,每个列的定义中相似的部分对齐。虽然这种列样式不是必须的,但是它比不对齐的文本流形式更容易理解。SQL关键字对人小写不敏感: Create Table, CREATE TABLE和 CrEaTe taBLE都是正确的。然而,记住在安装 SQL Server时选择的排列顺序决定标识符和字符串文字是否对大小写敏感。如果使用对大小写不敏感的排列顺序(默认的安装选项)安装 SQL Server,那么SQLServer认为表名 Customer, customer和 CUSTOMER是相同的,并且'x′等于'x′。如果使用对大小写敏感的排列顺序安装 SQL Server,那么 SQL Server扣衣名 Customer, customer和 CUSTOMER作为不同的标识符,并且认为'x′不等于'X注意:即使使用对大小写不敏感的排列顺序,系统表中的表名和其他对象名称也是以输入它们的方式存储,例如 Cus tomer, cus tomer或 CUSTOMER。因此,如果在 AppIa数据库中显示表的清单,那么例1-5所示的语句创建的表将被列为 Cus tomer,使用对大小写不敏感的排列κ序,仍然可以在SQL语句中使用CUST0MER或者cus tomer引用该表。例1-5中使用的表名是一种完全限定的名称,在未限定的表名( Customer)之前包括数据库名称( Appdta)和所有者名称(dbo)。使用小圆点“”作为限定名称的分隔符当创健数据斥对象吋,般建议在代码中明确指定数据厍名称和所有者名称,这样可以归炎表的数据厍和所有者,避免偶然在错误的数据厍中或者使用错误的所有者创建表正如本示例所示,为了创建一个由数据库所有者拥有的表,可以在限定的名称中使用dbo。如果省略了数据库名称,就会在当前数据库中创建表。当前数据库可以是分配给 SQL Server帐户的数据库,或者是在Use语句中指定的数据库,例1-5是 Customer基表的 Create Table语句例1-5create Table AppDta dbo CustomerCustidIntNot nu⊥_check(Custid>0)NameChar(30)Not nulcheck(nShiplinesvarcharNot nulDe faltHiplineVarchar(100) Not nuefaultShipi=yDe faultShipstateCharShippostalCodcl Chart nulShippostalcode2 charNot nu⊥DefaultShipcountryChar(30)otNu⊥faltPhoncvciccChar(15)Not nu1二faltPhone eaxCharNot nulstatusCharNot nu⊥_三LulimitNot nulCheck(Creditlimit Is Null)orEntryDatcTimc Datc-imoRoVITConstraintCustcmerpkPrimary key( Custid)ConstraintCustcmierstateck((( Cred=limit s N⊥⊥)))所有者名称也可以省略, SQL Server会用当前的用户名作为所有者,完全限定的表名和视图名必须是唯一的SQL对象名称可以长达128个字符,包括字母、数字和下述特殊的符号:(下划线)#(井号)、S(美儿符号)和@(at号)。如果只使用字封(A-Z)开头并且只包含字封和数字(0-9),对于跨系统或者跨国应用稈序,可以避免可能出现的命名问题。另外, Transact-SQL有多个保留字,例如 Create, Table和Oder,它们有特殊的含义这些保留字列在 Microsoft SQL Server Transact-SQL参考于册中的“保留关键字”话题中。如果希望使用这些保留字作为表名、列名或者其他SQL对象名称,那么当它们出现在SQL语句中时,必须用双引号括起这些名称。下面这个小例说明如何编写一个 SQL Server语句从表名为 Order的表中检索行Nacre custid -499320引号括起的名称也可以用于包含特殊字符的名称,如下示例:Selectder+ DetailWhere custid =499320般应避免使用SQL的保留字或者特殊的字符作为SQL对象的名称。注意:必须使用Sα L Server的“ quoted idcη tific”用户选项才能使用引号标识符。Transact-SL还允许使用方括号作为关键字的分隔符,例如[ Order]。这种语法不需要引号标识符用户选项。1.2.2在指定文件组上创建表正如在本章前面“定义文件组”一节中讨论的那样,可以定义文件组,它是一个或者多个存储应用程序数据的操作系统文件的集合。为了把一个新表放在用户定义的文件组上,可以在 Create Table语句的术端增加一个On子句Cust工IntNot Nu⊥⊥Creck( Cust-d >0NameCharotNu⊥⊥C∈Ck(NConstraint Customer Status Check(( status <.17)OCreditlimit Is Null1这个文件组必须已由 Alter database语句创建。注意:SQL还有一个 Create schema话句,用于将多个 Create table, Createview和