如前所述,在创建对象时,最好避免使用内嵌的空格或保留字作为对象名,但设计人员可能并没有遵守这个最佳实践原则。例如,我当前使用的数据库中有一个审核表名为Transaction,但是Transaction明显是一个保留字,不应用作表的名称。更糟糕的是,这个表中有一个Timestamp列和LineNo列。该表显然是由开发人员利用可视化工具创建的,因为用另一种方式创建它会出问题。下面是这个表的创建脚本的简化版本:
- CREATE TABLE Transaction
- (TransactionId bigint NOT NULL
- ,[Timestamp] datetime NOT NULL
- ,Service varchar(75) NOT NULL
- ,LineNo int )
如果尝试运行这个脚本,就会出现如下错误:
MSG 156,Level15,State1,Line 1
Incorrect systax near the keyword 'Transaction'
为了成功创建该表,必须界定该定义中的关键字。SQL Server支持两类界定字符:方括号和双引号。下面的示例说明了如何用方括号界定对象:
- CREATE TABLE [Transaction]
- (TransactionId bigint NOT NULL
- ,[Timestamp] datetime NOT NULL
- ,Service varchar(75) NOT NULL
- ,[LineNo] int )
下面的示例用双引号界定对象名:
- CREATE TABLE "Transaction"
- (TransactionId bigint NOT NULL
- ,"Timestamp" datetime NOT NULL
- ,Service varchar(75) NOT NULL
- ,"LineNo" int )
Management Studio 默认把新查询窗口的连接属性设置为支持双引号界定功能,当然你也可以关闭该功能。如果关闭了该功能,双引号就是无效操作符。用户打开和关闭双引号界定符的代码,如下:
SET QUOTED_ID ENTIFIER ON
...
SET QUOTED_ID ENTIFIER OFF
在示例中输入Transaction表的定义时,还要注意到Service和其他界定关键字一样是蓝色的,因为Service在SQL Server中是一个关键字,它可以像Description关键字一样使用,而不需要进行界定。
另一种必须界定的名称是带内嵌空格的名称。虽然我认为内嵌空格应可以用于对象名,但肯定也会有人持不同意见。按照经验,内嵌的空格会使已经很复杂的命名规范变得更复杂。所以应使用下面的代码创建表:
- CREATE TABLE [My long named table that holds customer data]
- ([Customer data key] NOT NULL
- ,[Customer Last Name] varchar(75) NOT NULL
- ,[Customer First Name] varchar(75)
- )
通过编写接口来访问带这类命名结构的表会出问题。如前所述,SQL Server的灵活性不应用作编写错误代码或创建问题对象的借口。
注意在使用Management Studio的脚本工具时,SQL Server会界定所有的对象。这不是因为这么做是必须的,也不是编写代码的最佳方式,而是因为在界定符中封装所有的对象,比编写脚本引擎来查找需要界定的对象更容易。
【责任编辑:云霞 TEL:(010)68476606】