在SQL Server 2014中为什么SELECT * FROM System_User不起作用,但SELECT * FROM [ProjectManage]。[dbo]。[System_User]工作
我正在使用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.FlowTemplateTransition
和FlowTemplateTransition
之间的区别是什么?
什么时候需要添加dbo,什么时候不需要? 我是否需要始终使用方括号? 谢谢
dbo是SQL Server中的默认模式。您可以创建自己的模式,以便更好地管理对象命名空间。
在SQL Server Management Studio中,您可以通过浏览到数据库 - 您的数据库 - 安全 - 模式来创建自己的模式。或者你可以执行下面的查询来创建一个模式。
CREATE SCHEMA [SchemaName] AUTHORIZATION [dbo]
你可以用它们进行逻辑分组的表,例如通过建立“供应商”的信息,另一个是“客户”数据的沙玛。您的表格将显示为:
vendors.BankAccounts
vendors.Transactions
customers.Address
而不是使用dbo的默认模式。
不需要总是使用方括号[]。但是,如果您的数据库或表名包含类似点(。)的东西,那么您必须使用[]。
你知道为什么在同一个数据库中,[ProjectManage]和相同的SQL查询对话框中。一个表FlowTemplateTransition可以通过SQL'SELECT * FROM FlowTemplateTransition'工作,但是一个表System_User不能通过SQL'SELECT * FROM System_User'工作。他们应该以相同的方式。 –
是的。由于SYSTEM_USER是SQL Server中的一个关键字,用于返回当前系统用户名。如果你输入“select System_User”,它将返回当前登录用户的名字。所以如果你有一个同名的表,你必须使用[]。 “select * from [System_User]”,那么只有SQL服务器会将它识别为表格 – samithagun
@ZhangPingfeng如果答案有助于解决您的问题,您可能希望将其标记为接受的答案。谢谢! – samithagun
由于您有3个问题。我已经单独列出。
- 为什么
SELECT * FROM System_User
不工作? -
dbo.FlowTemplateTransition
和FlowTemplateTransition
之间的区别 - 什么时候需要添加dbo,什么时候不需要?我是否总是需要使用方括号?
答案1:System_User
是sql server内置函数。你的表名与这个函数冲突,这就是它给出错误的原因。
答案2:dbo
是默认数据库所有者。如果你不写表所有者而不是Sql Server,则自动考虑dbo
作为该表的所有者。
答案3:一般dbo
是没有必要添加。 如果您在表名中使用关键字或特殊字符,则括号是必需的。
'dbo'位是*模式名称*,请参阅https://blog.sqlauthority.com/2009/09/07/sql-server-importance-of-database-schemas-in-sql-server/当需要使用模式名称时,您需要使用模式名称。 –