【问题标题】:SQL Create table script from DBMS contains [ ]SQL 从 DBMS 创建表脚本包含 [ ]
【发布时间】:2011-03-12 14:48:38
【问题描述】:

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

创建表 [dbo].[登录](
[用户 ID] [int] 非空,
[登录名] nvarchar COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
等等
)

这也是它在其他 DBMS 中的显示方式吗?
这是特定于使用的 DBMS 的东西吗?
这只是一个奇特的观点吗?

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

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

提前致谢,
巴拉吉S

【问题讨论】:

    标签: sql create-table


    【解决方案1】:

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

    自动化工具总是简单地使用 ID 引号比弄清楚什么时候可以不用它们更容易。

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

    【讨论】:

    • “不同的数据库产品使用不同的字符”——FWIW SQL 标准指定了双引号(ascii 0034)。 SQL Server 可以通过使用SET QUOTED_IDENTIFIER ON 来支持标准行为。
    • 感谢您的解释,这对理解“[]”的用法很有帮助。在上述上下文中,“解析”是什么意思?
    • @Rockbala:“解析”实际上是指“词法分析”。如果您的表或列名有空格(例如),那么任何正在读取您的 CREATE TABLE 语句的程序都无法理解它。对您来说,“CREATE TABLE 新用户(列...)”是有道理的,但程序会阻塞新用户和用户之间的空间。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多