2017-04-11 158 views
0

我正在使用SQL Server 2014管理工作室,我发现了一个奇怪的情况。 在SQL查询对话框中,我在下面的SQL关键字:在SQL Server 2014中为什么SELECT * FROM System_User不起作用,但SELECT * FROM [ProjectManage]。[dbo]。[System_User]工作

SELECT * FROM System_User 

我可以看到在资源管理对话框中的表名是:dbo.System_User 后来,当我试着执行它时,它说有一些语法错误。

如果我更改SQL为:

SELECT * FROM [ProjectManage].[dbo].[System_User] 

它工作得很好。

但实际上可以在同一个SQL查询对话框中,我有另外一个SQL:

SELECT * FROM FlowTemplateTransition 

和表名是在资源管理对话框dbo.FlowTemplateTransition

我的问题是: dbo.FlowTemplateTransitionFlowTemplateTransition之间的区别是什么?

什么时候需要添加dbo,什么时候不需要? 我是否需要始终使用方括号? 谢谢

+2

'dbo'位是*模式名称*,请参阅https://blog.sqlauthority.com/2009/09/07/sql-server-importance-of-database-schemas-in-sql-server/当需要使用模式名称时,您需要使用模式名称。 –

回答

0

dbo是SQL Server中的默认模式。您可以创建自己的模式,以便更好地管理对象命名空间。

在SQL Server Management Studio中,您可以通过浏览到数据库 - 您的数据库 - 安全 - 模式来创建自己的模式。或者你可以执行下面的查询来创建一个模式。

CREATE SCHEMA [SchemaName] AUTHORIZATION [dbo] 

你可以用它们进行逻辑分组的表,例如通过建立“供应商”的信息,另一个是“客户”数据的沙玛。您的表格将显示为:

vendors.BankAccounts 
vendors.Transactions 
customers.Address 

而不是使用dbo的默认模式。

不需要总是使用方括号[]。但是,如果您的数据库或表名包含类似点(。)的东西,那么您必须使用[]。

+0

你知道为什么在同一个数据库中,[ProjectManage]和相同的SQL查询对话框中。一个表FlowTemplateTransition可以通过SQL'SELECT * FROM FlowTemplateTransition'工作,但是一个表System_User不能通过SQL'SELECT * FROM System_User'工作。他们应该以相同的方式。 –

+0

是的。由于SYSTEM_USER是SQL Server中的一个关键字,用于返回当前系统用户名。如果你输入“select System_User”,它将返回当前登录用户的名字。所以如果你有一个同名的表,你必须使用[]。 “select * from [System_User]”,那么只有SQL服务器会将它识别为表格 – samithagun

+0

@ZhangPingfeng如果答案有助于解决您的问题,您可能希望将其标记为接受的答案。谢谢! – samithagun

0

由于您有3个问题。我已经单独列出。

  1. 为什么SELECT * FROM System_User不工作?
  2. dbo.FlowTemplateTransitionFlowTemplateTransition之间的区别
  3. 什么时候需要添加dbo,什么时候不需要?我是否总是需要使用方括号?

答案1:System_User是sql server内置函数。你的表名与这个函数冲突,这就是它给出错误的原因。

答案2:dbo是默认数据库所有者。如果你不写表所有者而不是Sql Server,则自动考虑dbo作为该表的所有者。

答案3:一般dbo是没有必要添加。 如果您在表名中使用关键字或特殊字符,则括号是必需的。

相关问题