当我想从数据库X中的表Y中选择时,我可以使用
select * from [X].[dbo].[Y]
或
USE X
select * from [Y]
有没有理由更喜欢一个而不是另一个?
答案 0 :(得分:3)
<强> DBO 强>
使用dbo作为所有数据库对象的所有者可以简化对象的管理。您将始终在数据库中拥有dbo用户。只要用户具有适当的权限,数据库中的用户就可以访问dbo拥有的任何对象,而无需指定所有者。
使用X
当SQL Server登录连接到SQL Server时,登录会自动连接到其默认数据库并获取数据库用户的安全上下文。如果没有为SQL Server登录创建数据库用户,则登录将以guest身份连接。如果数据库用户对数据库没有CONNECT权限,则USE语句将失败。如果没有为登录分配默认数据库,则其默认数据库将设置为master。
Understanding the Difference between Owners and Schemas in SQL Server
答案 1 :(得分:2)
USE X会将上下文更改为X,并且所有以下语句都将在上下文X中执行。
但是X.dbo.Y将访问对象Y而不更改当前上下文。
例如:让我们考虑有两个数据库DB1和DB2。 DB1包含表T1和amp; T2和DB2包含表U1和表。 U2。
现在,
USE DB1 -- here context set to DB1
select * from T1 -- works fine
select * from U1 -- gives error, because U1 is not in current context
select * from DB2.dbo.U1 -- works fine, because it access the context DB2 from current content context DB1
select * from T2 -- works fine
USE DB2 -- here context changed to DB2
select * from U2 -- works fine
select * from T1 -- gives error, because T1 is not in current context
select * from DB1.dbo.T1 -- works fine, because it access the context DB1 from current content context DB2
答案 2 :(得分:1)
我倾向于在脚本可以从多个数据库中查询多个表的实例中使用[server].[database].[schema].[table]
。
USE [database]
通常用于所有语句都应用于同一数据库并且您需要确保将它们应用于正确数据库的情况。您是否曾连接到服务器并运行脚本只是为了找到您在master
数据库上运行它?
答案 3 :(得分:0)
通过使用第一个Query,您可以从其他数据库执行该选择。在同一窗口中,您还可以选择其他数据。
但是通过使用第二个选择,您可以在同一个窗口中选择(USE X
)数据库。
答案 4 :(得分:0)
有时您希望架构和数据库由登录决定,在这种情况下,您应该只使用对象名称。这是不完全符合条件的一个原因。