2010-07-07 95 views
2

如果有人用Microsoft从Microsoft使用SQL Server management Studio右键单击数据库中的给定表并在脚本表中创建查询窗口,它会在窗口中显示创建表代码。我注意到类似如下SQL从DBMS创建表脚本包含[]

CREATE TABLE [DBO]。[登录](
[用户ID] [INT] NOT NULL,
[LoginName将]为nvarchar COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,


这是怎么出现在其他DBMS呢?
这是什么特定于DBMS使用?
这只是一个奇特的观点吗?

为什么“[]”用于列名和表名。简单TSQL定义看起来像
CREATE TABLE表名(
#1列数据类型NOT NULL,
列#2数据类型NOT NULL UNIQUE,
- 等等

请不要介意我愚蠢的问题。

由于提前,
巴拉吉小号

回答

2

那些是标识符引号。它们将内容标记为数据库标识符(列名,表名等),并允许将空格,特殊字符和保留字用作标识符。通常这些都不会出现在标识符中,所以严格来说,ID引号是不必要的。当由于特殊字符或保留字而无法解析文本时,需要使用ID引号。

自动化工具简单地总是使用ID引号比在没有它们的情况下逃脱时更容易。

不同的数据库产品使用不同的字符作为ID引号。您经常会看到用于此的反码(`)。

+0

”不同的数据库产品使用不同的字符“ - FWIW SQL标准指定双引号(ascii 0034)。 SQL Server可以通过使用'SET QUOTED_IDENTIFIER ON'来支持标准行为。 – onedaywhen 2010-07-07 07:41:41

+0

感谢您的解释,它有助于理解“[]”的用法。 您在上述上下文中的“解析”是什么意思? – rockbala 2010-07-08 01:38:41

+0

@罗克巴拉:“解析”我其实是指“lexing”。如果您的表或列名称具有空格(例如),则无论程序读取您的CREATE TABLE语句都无法理解它。对你来说“CREATE TABLE New Users(Columns ...)”是有道理的,但是程序会在New和Users之间的空间中窒息。 – 2010-07-08 16:56:50

0

只需添加到Larry Lustig的优秀答案,SQL Server的'创建脚本'功能就会吐出SQL代码,其首要任务是解析器友好,这就是为什么它总是使用其优先定界标识符字符作为方括号,而不是比如SQL-92标准使用的双引号(SQL Server代码可以使用SET QUOTED_IDENTIFIER ON支持标准分隔标识符,但我不认为这可以被指定为输出选项)。对人眼(使用空格,换行符等)容易,只是次要考虑。 “