在SQL Server中,为什么会这样:
[dbo].[table_name]
比这更好:
dbo.table_name
顺便说一句,如果只有一个架构,为什么甚至会列出dbo?
答案 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是一个好主意,因为
答案 7 :(得分:0)
这不是允许你在那里拥有你想要的任何“坏”物品吗? 关键词,空间等...
答案 8 :(得分:0)
我宁愿避免在表名和列名中使用标点符号和保留字,也不要使用方括号。这使SQL更容易阅读。
答案 9 :(得分:0)
除了标识符名称中的空格,保留关键字和系统函数外,标识符还可以包含regular identifiers中不允许的某些字符,必须用方括号分隔。
您可以在this article中找到有关常规和分隔标识符的详细说明和规则。
来自文章:
例如,分隔标识符可以包含空格,任何字符 适用于常规标识符,以及以下任何一种标识符 字符:
波浪号(〜)连字符,( - )感叹号(!),左大括号({),百分比(%), 右括号(}),插入符号(^),撇号('),&符号(&),句号(。),左 括号((),反斜杠(),右括号()),重音符号(`),
使用两个名称限定约定可以提高性能(避免名称解析),并避免在有例如两个或多个模式中的相同表名。在这种情况下,SQL Server将在dbo中搜索您的对象,如果它不在那里,它将停止搜索。
此外,如果您以后想要将该对象与SCHEMABINDING选项一起使用,则它不允许使用非限定对象名称。
希望这有帮助