您现在的位置: 晨光科技 >> 文章 >> 技术 >> IT >> 正文  
  分隔标识符         
分隔标识符
[ 作者:佚名    转贴自:http://software.it168.com/manual/sqlserver/ac_8_con_03_89rn.htm    点击数:217    更新时间:2011/6/14    文章录入:admin ]
[注:本站登载的某些文章并不代表本站支持或反对其观点或肯定其真实性]

分隔标识符
符合所有标识符格式规则的标识符可以使用分隔符,也可以不使用分隔符。不符合标识符格式规则的标识符必须使用分隔符。

分隔标识符在下列情况下使用:

当在对象名称或对象名称的组成部分中使用保留字时。
推荐不要使用保留关键字作为对象名称。从 Microsoft® SQL Server™ 早期版本升级的数据库可能含有标识符,这些标识符包括早期版本中未保留而在 SQL Server 2000 中保留的字。可用分隔标识符引用对象直到可改变其名称。

当使用未被列为合法标识符的字符时。
SQL Server 允许在分隔标识符中使用当前代码页中的任何字符。但是,不加选择地在对象名称中使用特殊字符将使 SQL 语句和脚本难以阅读和维护。

Transact-SQL 所使用的分隔符类型:

说明  分隔符仅用于标识符。分隔符不能用于关键字,不论它们在 SQL Server 中是否被标记为保留字。

被引用的标识符用双引号 (") 分隔开:
SELECT * FROM "Blanks in Table Name"

括在括号中的标识符用方括号 ([ ]) 分隔:
SELECT * FROM [Blanks In Table Name]

仅当 QUOTED_IDENTIFIER 选项设置为 ON 时,被引用的标识符才有效。默认情况下,当用于 SQL Server 的 Microsoft OLE DB 提供程序和 SQL Server ODBC 驱动程序连接时,将 QUOTED_IDENTIFIER 设置为 ON。默认情况下,DB-Library 不将 QUOTED_IDENTIFIER 设置为 ON。不管使用何种接口,个别应用程序或用户可随时更改设置。SQL Server 提供了多种方法来指定该选项。例如,在 SQL Server 企业管理器和 SQL 查询分析器中,该选项可在对话中设置。在 Transact-SQL 中,可以使用 SET QUOTED_IDENTIFIER、sp_dboption 的 quoted identifier 选项或 sp_configure 的 user options 选项将此选项设为多种级别。

当 QUOTED_IDENTIFIER 为 ON 时,对于 SQL 语句中的双引号和单引号 (') 的使用,SQL Server 遵循 SQL-92 规则:

双引号只能用于分隔标识符,不能用于分隔字符串。
为保持与现有应用程序的兼容性,SQL Server 并不完全强制该规则。如果字符串没有超过标识符的长度,则该字符串可包含在双引号内。但不建议这样做。

单引号必须用来包含字符串,不能用于分隔标识符。
如果字符串包含单引号,则需要在单引号前再增加一个单引号:

SELECT * FROM "My Table"
WHERE "Last Name" = 'O''Brien'

当 QUOTED_IDENTIFIER 为 OFF 时,对于双引号和单引号的使用,SQL Server 遵循如下规则:

引号不能用于分隔标识符,而是用括号作为分隔符。


单引号或双引号可用于包含字符串。
如果使用双引号,嵌入的单引号不需要用两个单引号来表示:

SELECT * FROM [My Table]
WHERE [Last Name] = "O'Brien"

无论 QUOTED_IDENTIFIER 的设置如何,都可以在括号中使用分隔符。

分隔标识符规则
分隔标识符的格式规则是:

分隔标识符可以包含与常规标识符相同的字符数(1 到 128 个,不包括分隔符字符)。本地临时表标识符最多可以包含 116 个字符。


标识符的主体可以包含当前代码页内字母(分隔符本身除外)的任意组合。例如,分隔符标识符可以包含空格、对常规标识符有效的任何字符以及下列任何字符: 代字号 (~) 连字符 (-)
惊叹号 (!) 左括号 ({)
百分号 (%) 右括号 (})
插入号 (^) 撇号 (')
and 号 (&) 句号 (.)
左圆括号 (() 反斜杠 (\)
右圆括号 ()) 重音符号 (`)


这些例子在表名和列名中使用被引起来的标识符。指定分隔标识符的两种方法如下所示:

SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE "$Employee Data"
(
 "^First Name"   varchar(25) NOT NULL,
 "^Last Name"   varchar(25) NOT NULL,
 "^Dept ID"   int
)
-- INSERT statements go here.
SET QUOTED_IDENTIFIER OFF
GO
CREATE TABLE [^$Employee Data]
(
 [^First Name]   varchar(25) NOT NULL,
 [^Last Name]   varchar(25) NOT NULL,
 [^Dept ID]   int
)
-- INSERT statements go here.

在创建 $Employee Data 和 ^$Employee Data 两表以及输入数据之后,就可以进行行检索:

SET QUOTED_IDENTIFIER ON
GO
SELECT *
FROM "$Employee Data"
SET QUOTED_IDENTIFIER OFF
GO
-- Or
SELECT *
FROM [^$Employee Data]

在下面这个例子中,名为 table 的表中包含 tablename、user、select、insert 等列。由于 TABLE、SELECT、INSERT、UPDATE 和 DELETE 均为保留关键字,因此在每次访问对象时都必须分隔标识符。

SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE "table"
(
 tablename char(128) NOT NULL,
 "USER"    char(128) NOT NULL,
 "SELECT"  char(128) NOT NULL,
 "INSERT"  char(128) NOT NULL,
 "UPDATE"  char(128) NOT NULL,
 "DELETE"  char(128) NOT NULL
)

如果 SET QUOTED_IDENTIFIER 不是 ON,除非使用方括号分隔符,否则不能访问表和列。

SET QUOTED_IDENTIFIER OFF
GO
SELECT *
FROM "table"

下面是结果集:

Msg 170, Level 15, State 1
Line 1: Incorrect syntax near 'table'.

下面是结果集(使用括号分隔符):

SET QUOTED_IDENTIFIER OFF
GO
SELECT *
FROM [table]

将标识符分隔为多个部分
当使用合法对象名称时,可能要分隔组成对象名的多个标识符。必须分别分隔每个标识符,例如:

/* SQL-92 quoted identifier syntax */
SELECT *
FROM "My DB"."My#UserID"."My.Table"

-或-

/* Transact-SQL bracketed identifier syntax */
/* Not available in SQL Server 6.5 or earlier */
SELECT *
FROM [My DB].[My#UserID].[My.Table]

关于如何分隔 ODBC CALL 语句中由多部分组成的存储过程名有一些特殊规则。有关更多信息,请参见调用存储过程。

在 SQL Server 中将标识符用作参数
许多系统存储过程、函数和 DBCC 语句都把对象名当作参数。其中一些参数接受多部分对象名,另一些则只接受单部分名称。接受单部分对象名称还是多部分对象名称决定了 SQL Server 在内部如何分析和使用参数。

单部分参数名
如果参数为单部分标识符,则可以这样指定名称:

无引号或分隔符。


包含在单引号内。


包含在双引号内。


包含在括号内。
对于单部分名称,单引号内的字符串代表对象名称。如果在单引号内使用分隔符,则分隔符字符将被视为名称的一部分。

如果名称包含句号或常规分隔符所定义的字符集合以外的其它字符,必须将对象名称包含在单引号、双引号或括号内。

多部分参数名称
多部分名称为合法的名称,这种名称除了对象名称外,还包含数据库名称或所有者名称。SQL Server 要求在使用多部分名称作为参数时,必须将组成多部分名称的完整字符串包含在一组单引号内。

EXEC MyProcedure @name = 'dbo.Employees'

如果个别的名称部分要求分隔符,则名称的每一部分都应根据要求单独分隔。例如,如果名称某部分包含句号、双引号、左括号或右括号,则需要使用双引号来分隔这部分。用单引号包含整个名称。

例如,表名 tab.one 包含一个句号。为防止该名称被解释为一个三部分的名称 dbo.tab.one,所以用分隔符分隔表名部分。

EXEC sp_help 'dbo.[tab.one]'

下面给出一个用双引号分隔的相同表名的例子。

SET QUOTED_IDENTIFIER ON
GO
EXEC sp_help 'dbo."tab.one"'
GO

下表列出了一些使用多部分名称的 Transact-SQL 函数、DBCC 语句和系统存储过程。

函数或存储过程 参数名
COL_LENGTH table
DBCC CHECKIDENT table_name
DBCC CHECKTABLE table_name
DBCC DBREINDEX database.owner.table_name
DBCC SHOW_STATISTICS table
DBCC TEXTALLOC table_name
DBCC UPDATEUSAGE table_name
IDENT_INCR table_or_view
IDENT_SEED table_or_view
INDEX_COL table
OBJECT_ID object
sp_addextendedproc procedure
sp_autostats table_name
sp_bindefault default
object_name
sp_bindrule rule
object_name
sp_changeobjectowner object
sp_depends object
sp_dropextendedproc procedure
sp_fulltext_column qualified_table_name
sp_fulltext_table qualified_table_name
sp_help name
sp_helpconstraint table
sp_help_fulltext_columns table_name
sp_help_fulltext_columns_cursor table_name
sp_help_fulltext_tables table_name
sp_help_fulltext_tables_cursor table_name
sp_helpindex name
sp_helprotect object_statement
sp_helptext name
sp_helptrigger table
sp_procoption procedure
sp_recompile table
sp_rename object_name
sp_spaceused objname
sp_tableoption table
sp_unbindefault object_name
sp_unbindrule object_name

 

请参见

ALTER DATABASE

ALTER PROCEDURE

ALTER TABLE

ALTER TRIGGER

ALTER VIEW

CREATE DATABASE

CREATE DEFAULT

CREATE PROCEDURE

CREATE RULE

CREATE TABLE

CREATE TRIGGER

保留关键字

SET QUOTED_IDENTIFIER

  • 上一篇文章: 索引视图如何提高性能

  • 下一篇文章: 用DD-WRT使无线路由成中继蹭网
  •    
    [注:标题搜索比内容搜索快]
    发表评论】【告诉好友】【打印此文】【关闭窗口
     最新5篇热点文章
  • 轨道钢承重计算公式及应用[109]

  • 【选型】如何为变频器选取阻值…[86]

  • AIS2023参展厂商名录[345]

  • AGV综合选型[170]

  • APIE 2023第4届亚太国际智能装…[138]

  •  
     最新5篇推荐文章
  • 外媒:正在唤醒中国的习近平[305]

  • 中国反伪科学运动背后的CIA黑手…[494]

  • [转载]袁隆平真言:中国最大的…[668]

  • 台专家:当年我们造IDF时 大陆…[572]

  • 旅日华人:中国严重误判日本民…[577]

  •  
     相 关 文 章
  • 索引视图如何提高性能[97]

  • 视图的创建及使用(sqlserver 2…[112]

  • MS SQL视图使用详解[117]

  • SQL Server:视图的架构刷新和绑…[186]


  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
        没有任何评论
    设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 | 
    版权所有 Copyright© 2003 晨光科技        站长:璀璨星辰        页面执行时间:279.30毫秒
    Powered by:MyPower Ver3.5