有人请向我解释SQL Server如何使用点符号来识别
表的位置?我一直认为,该位置是Database.dbo.Table
但我看到有东西代替dbo
别的,像代码:
DBName.something.Table
可有人请解释一下吗?SQL点符号
SQL点符号
回答
这是一个数据库模式。表的全部三个部分的名称是:
databasename.schemaname.tablename
对于用户的默认模式,你也可以省略架构名称:
databasename..tablename
您还可以指定链接服务器名称:
servername.databasename.schemaname.tablename
你可以阅读更多有关使用上MSDN标识符作为表名:
服务器,数据库和所有者名称被称为对象名称的限定符。当你引用一个对象时,你不必指定服务器,数据库和所有者。通过用一段时间标记他们的位置可以省略限定符。对象名称有效形式包括以下内容:
server_name.database_name.schema_name.object_name
server_name.database_name..object_name
server_name..schema_name.object_name
服务器名称... OBJECT_NAME
database_name.schema_name.object_name
database_name..object_n AME
schema_name.object_name
OBJECT_NAME
,指定所有四个部分被称为一个完全合格的名称的对象名。在Microsoft SQL Server中创建的每个对象都必须具有唯一的完全限定名称。例如,如果它们拥有不同的所有者,则可以在同一个数据库中有两个名为xyz的表。
大多数对象引用使用三部分名称。默认的server_name是本地服务器。默认的database_name是连接的当前数据库。默认的schema_name是提交语句的用户的默认模式。除非另行配置,否则新用户的默认模式是dbo模式。
@Szymon说了什么。您还应该总是提出模式限定对象引用(无论表,视图,存储过程等)。)未限定的对象引用解决以下方式:
探头当前数据库中属于当前连接在其下运行的凭据的默认架构指定名称的对象的命名空间。
如果未找到,请探测当前数据库的名称空间,以查找属于
dbo
模式的指定名称的对象。
而如果对象引用是名称以sp_
,它的更坏,因为两个步骤被添加到解析过程的存储过程(除非引用是数据库修饰):上述两个步骤重复,但是这次,查看数据库master
而不是当前数据库。
所以像
select *
from foo
查询需要命名的两个探头来解决foo
(假设表/视图实际上是dbo.foo
):首先你的默认架构(john_doe.foo
)下,然后,没被发现下dbo
(dbo.foo
“),而
select *
from dbo.foo
立即与命名空间的单个探针解决。
这具有3个含义:
冗余的查找是昂贵的。
它抑制查询计划缓存,因为每个执行必须被重新评估,这意味着查询必须被重新编译为每个执行(和取出编译时锁)。
你会在某一点或另一个位置在自己的脚下拍摄自己,并在默认架构下无意中创建一些应该在
dbo
架构下存在(也许已经存在)的东西。现在你已经有了两个版本。在某些时候,您或其他人(通常发生在生产中)将运行查询或执行存储过程并得到意外的结果。需要相当长的一段时间才能发现同一对象有两个[不同]版本,以及执行哪一个版本取决于他们的用户凭证以及引用是否符合模式限定。
总是符合模式限定,除非您有真正的理由不要。这就是说,为了开发的目的,有时可以保持个人模式下的“新”版本和“dbo”模式下的“当前”版本。它可以很容易地进行并行测试。然而,这并非没有风险(见上文)。
当SQL看到语法时,它将首先查看当前用户模式以查看表是否存在,如果存在,将使用该语法。 如果没有,那么它会查看dbo架构并使用该表中的表
- 1. SQL中的点符号FROM子句
- 2. 在SQL语句中的标点符号
- 3. 在SQL中添加标点符号
- 4. SQL Escape'#'符号
- 5. JSON点符号
- 6. 点符号dealloc?
- 7. 标点符号
- 8. SQL查询符号“* =”
- 9. SQL Server:在字符串中隐藏标点符号
- 10. JSON点符号字符串
- 11. Path.Combine和点符号
- 12. 点符号混淆
- 13. Eclipse黄点符号
- 14. Regex.Replace标点符号
- 15. 标点符号中的标点符号被替换为..X
- 16. 点表示法VS括号符号
- 17. localhost.:8088 - “点冒号”符号的用途
- 18. 用点符号VS括号标记
- 19. SQL查询搜索&符号&
- 20. T-SQL左连接符号
- 21. 逃生与SQL Server符号
- 22. PL/SQL:遇到符号“END”
- 23. SQL符号/变量名称
- 24. SQL与Oracle - 特殊符号
- 25. 包括标点符号在标点符号后分割字符串
- 26. MongoDB点符号更新时
- 27. c#添加标点符号
- 28. 删除标点符号python
- 29. 使用无点符号
- 30. jquery .val标点符号?
'dbo'只是一个架构,即数据库所有者拥有的默认架构。您可以在同一个数据库中创建额外的模式。因此,您可以获得[linked_server]。[database]。[schema]。[object]其中对象可以是表,视图,函数,存储过程等。 – MatBailie
更多信息请访问:http://stackoverflow.com/questions/1062075/why-do-table-names-in-sql-server-start-with-dbo – JohnLBevan
仅供参考:我个人只使用默认的dbo模式;我可能想区分表的唯一原因是将配置和安全设置中的业务数据分离,以使刷新更清晰;但后来我可能会使用多个数据库,因为我可能对配置和数据拥有不同的权限。 – JohnLBevan