引用表

时间:2008-10-27 14:23:40

标签: sql-server

在SQL Server中,为什么会这样:

[dbo].[table_name]

比这更好:

dbo.table_name

顺便说一句,如果只有一个架构,为什么甚至会列出dbo?

10 个答案:

答案 0 :(得分:4)

如果表名包含关键词,则必须将其括在[]中。大多数工具(如ORM)使用此技术来避免任何错误或一致性。

答案 1 :(得分:3)

以防万一你有一个关键字作为像[user]

这样的表名

答案 2 :(得分:3)

它允许表名中的关键字或标点符号。

代码生成器经常将它用于所有名称,因此他们不必弄清楚它是否真的需要。

答案 3 :(得分:3)

这些通常出现在生成的代码中 - 因为更容易使代码生成产生完全限定和转义的引用,而不是推断出什么时候需要转义/限定。

答案 4 :(得分:2)

如果只有一个模式,那么我认为前缀表名不是必需的或有用的。如果您的标识符是sql server中的保留字,则使用方括号[]非常有用。例如,如果您有一个名为Select的表,则可以将其引用为SELECT * FROM [Select],而不是SELECT * FROM Select

答案 5 :(得分:1)

我不使用括号,只有在使用关键字作为模式或表名时才需要使用括号。

但我建议不要在前面放弃dbo。原因是最终您可能希望开始将代码组织到模式中,然后您将需要前缀。如果您养成使用schema.table格式的习惯,那么 lot 将更容易在代码中搜索使用表的位置。

假设您有一个名为dbo.user的表,并且您决定将其移动到另一个模式。如果你必须搜索一堆存储过程或动态sql为“用户”,你可能会得到大量的误报。你不能完全确定你做了所需的所有改变。搜索“dbo.user”更加简洁。

答案 6 :(得分:1)

仅当对象名称包含空格等字符或它是关键字时才需要[]。通常认为不使用任何这些作为对象名称是最佳做法,因此您永远不需要[]。说过它们也没有坏处,如果它是生成代码并包括括号那么你也可以留下它们 使用dbo是一个好主意,因为

  1. 效果更好(有些数字见here
  2. 在某些情况下需要
  3. dbo,例如调用用户定义的函数。我认为总是包括它是一件好事。
  4. 如果您确实创建了多个模式,那么未限定对象名称可能会导致将来出现错误。

答案 7 :(得分:0)

这不是允许你在那里拥有你想要的任何“坏”物品吗? 关键词,空间等...

答案 8 :(得分:0)

我宁愿避免在表名和列名中使用标点符号和保留字,也不要使用方括号。这使SQL更容易阅读。

答案 9 :(得分:0)

除了标识符名称中的空格,保留关键字和系统函数外,标识符还可以包含regular identifiers中不允许的某些字符,必须用方括号分隔。

您可以在this article中找到有关常规和分隔标识符的详细说明和规则。

来自文章:

  

例如,分隔标识符可以包含空格,任何字符   适用于常规标识符,以及以下任何一种标识符   字符:

     

波浪号(〜)连字符,( - )感叹号(!),左大括号({),百分比(%),   右括号(}),插入符号(^),撇号('),&符号(&),句号(。),左   括号((),反斜杠(),右括号()),重音符号(`),

使用两个名称限定约定可以提高性能(避免名称解析),并避免在有例如两个或多个模式中的相同表名。在这种情况下,SQL Server将在dbo中搜索您的对象,如果它不在那里,它将停止搜索。

此外,如果您以后想要将该对象与SCHEMABINDING选项一起使用,则它不允许使用非限定对象名称。

希望这有帮助