3.2 SQL Server的命名规则

为了提供完善的数据库管理机制,SQL Server 2016设计了严格的命名规则。用户在创建或引用数据库实体(如表、索引、约束等)时,必须遵守SQL Server 2016的命名规则,否则有可能发生一些难以预料和检查的错误。本节将具体讲解标识符的分类和格式、数据库对象的命名规则与实例命名规则。

3.2.1 标识符

SQL Server 2016的所有对象,包括服务器、数据库以及数据库对象,如表、视图、列、索引、触发器、存储过程、规则、默认值和约束等都可以有一个标识符。对绝大多数对象来说,标识符是必不可少的,但对某些对象(如约束)来说,是否规定标识符是可选的。对象的标识符一般在创建对象时定义,作为引用对象的工具使用。

例如下面的SQL语句:

    CREATE TABLE student
    (
    id int primary key,
    name varchar(20)
    )

这个例子创建了一个表格,表格的名字是一个标识符:student。表格中定义了两列,列的名字分别是id和name,它们都是合法的标识符。此外,上述语句还自动定义了另一个未命名的主键约束。

1.标识符分类

具体来说,SQL Server 2016共定义了两种类型的标识符:常规标识符(Regular Identifier)和分隔标识符(Delimited Identifier)。

(1)常规标识符:常规标识符严格遵守标识符有关格式的规定,在T-SQL语句中,凡是常规标识符都不必使用分隔符,如使用[]和‘ ’来进行分隔。例如,上述例子中使用的表名student就是一个常规标识符,在student上不必添加分隔符。

(2)分隔标识符:那些使用了分隔符号(如[]和‘ ’等)来进行位置限定的标识符。使用了分隔标识符,既可以遵守标识符命名规则,又可以不遵守标识符命名规则。需要注意的是,遵守了标识符命名规则的标识符,加分隔符与不加分隔符是等效的。例如,SELECT * FROM[student]语句从student表格中查询出所有数据,其功能与SELECT * FROM student语句等效。这是因为在“[]”中的标识符遵守标识符命名规则,“[]”被忽略不计。

如果是不遵守标识符命名规则的标识符,那么在T-SQL语句中就必须使用分隔符号加以限定,如:

    SELECT * FROM [my table]
    WHERE [order]=10

在这个例子中,必须使用分隔标识符,因为在FROM子句中的标识符my table中含有空格,而where子句中的标识符order是系统保留字。

这两个标识符都不遵守标识符命名规则,必须使用分隔符,否则无法通过代码编译。

2.标识符格式

与程序设计语言类似,SQL Server 2016中的标识符必须符合一定的格式规定,其具体内容如下:

(1)标识符必须是统一码(Unicode)2.0标准中规定的字符,以及其他一些语言字符,如汉字等。

(2)标识符后的字符可以是“_”“@”“#”“$”及数字。

(3)标识符不允许是T-SQL的保留字。

(4)标识符内不允许有空格和特殊字符。

需要注意的是,标识符最多可以容纳128个字符。此外,某些以特殊符号开头的标识符在SQL Server中具有特定的含义。例如,以“@”开头的标识符表示这是一个局部变量或一个函数的参数,以“#”开头的标识符表示这是一个临时表或一个存储过程,以“##”开头的标识符表示这是一个全局的临时数据库对象。在T-SQL中,全局变量以“@@”开头。

3.2.2 对象命名规则

SQL Server 2016使用T-SQL语言,该语言中使用的数据对象包括表、视图、存储过程、触发器等,这些对象的标识符也需符合如下命名规则。

(1)第一个字符必须是这些字符之一:字母a~z和A~Z、来自其他语言的字母字符、下划线_、@或者数字符号#。

(2)后续字符可以是所有的字母、十进制数字、@符号、美元符号($)、数字符号或下划线。

除非另外指定,否则所有对数据库对象名的T-SQL引用可以是由4部分组成的名称,格式如下:

    [
       server_name.[database_name].[owner_name].
       | database_name.[owner_name].
       | owner_name.
       ]
    ]
    object_name

具体的语法解释如下:

● server_name指定链接服务器名称或远程服务器名称。

● 当对象驻留在SQL Server 2016数据库中时,database_name指定该SQL Server 2016数据库的名称;当对象在链接服务器中时,则指定OLE DB目录。

● 如果对象在SQL Server 2016数据库中,owner_name指定拥有该对象的用户;当对象在链接服务器中时,则指定OLE DB架构名称。

● object_name是引用对象的名称。

引用对象名的格式如表3.1所示。

表3.1 引用对象名的格式

当引用某个特定对象时,不必总是为SQL Server指定标识该对象的服务器、数据库和所有者。可以省略中间级节点,而使用句点表示这些位置。对象名的有效格式是:

    server.database.owner.object
    server.database..object
    server..owner.object
    server...object
    database.owner.object
    database..object
    owner.object
    对象

3.2.3 实例命名规则

所谓SQL实例,即SQL服务器引擎。每个SQL Server 2016数据库引擎实例各有一套不为其他实例共享的系统及用户数据库,在一台计算机上可以安装多个SQL Server 2016,每个SQL Server 2016就可以理解为一个实例。

实例又分为“默认实例”和“命名实例”,如果在一台计算机上安装第一个SQL Server,命名设置保持默认,那么这个实例就是默认实例。在SQL Server 2016中,默认实例的名字采用计算机名,实例的名字一般由计算机名字和实例名字两部分组成。为更好地理解实例,读者可以从如下几个方面着手:

(1)实例名称是一个SQL Server服务的名称,可以为空或者任何名称(英文字符),实例名称不能重复。

(2)如果安装时一直提示写实例名称,说明已经存在一个默认名称的SQL Server实例,它使用了默认的空名称。

(3)一个实例就是一个单独的SQL Server服务。如果安装了指定的SQL Server实例,可以在Windows服务列表中看到该实例的服务名称。

(4)连接数据库时,必须指明数据库实例名称。例如,使用默认配置安装了一个SQL Server后,它的实例名称为空。

(5)再次执行SQL Server安装程序,并不会提示已经安装了SQL Server,而是在设置实例名称时,让用户指定一个新的实例名称,才能进行下一步。

(6)卸载SQL Server时,可以选择卸载一个SQL Server实例。

正确掌握数据库的命名和引用方式是用好SQL Server的前提,也有助于用户理解SQL Server中的其他内容。