2011-02-09 79 views
42

是否有方法可以为查询设置模式,以便在查询的其余部分中,我可以仅通过名称引用表,而不必将它们与模式名称相提并论?为SQL查询设置默认模式

举例来说,我愿做这样的事情:

Use [schemaName] 
select * from [tableName] 

与此相反:

select * from [schemaName].[tableName] 
+1

指向您的数据库名称并选择SQLMS中的新查询。使用DBNAME;从[表名]中选择*是正确的。 – Crimsonland 2011-02-09 06:58:47

回答

30

快速谷歌指向我this page。它解释了从sql server 2005开始,你可以用ALTER USER语句设置用户的默认模式。不幸的是,这意味着你永久地改变它,所以如果你需要在模式之间切换,每次执行一个存储过程或一批语句时都需要设置它。或者,您可以使用描述为here的技术。

如果您正在使用sql server 2000或更早版本this page说明用户和模式是等价的。如果您不用schema \ user预先指定表名,则sql server将首先查看当前用户拥有的表,然后查看dbo拥有的表以解析表名。看起来,对于所有其他表,您必须预先安排架构\用户。

+0

这就是我所追求的。谢谢。 – Chev 2011-02-10 15:26:30

+0

这让我想到了我需要的答案。事实证明,如果用户是SysAdmin固定服务器角色的成员,则默认架构将被忽略。它只是使用dbo ... – ShaneBlake 2015-05-27 13:31:35

11

我不相信有一个“每次查询”的方式来做到这一点。 (您可以使用use关键字指定数据库 - 而不是模式 - 但这是技术上一个单独的查询,你必须事后发出go命令。)

请记住,在SQL服务器的完全限定表名是格式:。

[数据库] [方案] [表]

在SQL Server Management Studio中,您可以配置所有你问的默认值。

  • 您可以设置默认database在每个用户的基础上(或在您的连接字符串):

    安全性>登录>(右键)用户>属性>常规

  • 您可以在每个用户的基础上设置默认schema(但我不相信您可以在连接字符串中对其进行配置,但如果您使用始终为默认值的dbo):

    安全性>登录>(右键)用户>属性>用户映射>默认架构

总之,如果你使用dbo为您的架构,你可能有至少头痛的数量。

0

动态或如果u增加模式的另一种方法想将其更改为别的

DECLARE @schema AS VARCHAR(256) = 'dbo.' 
--User can also use SELECT SCHEMA_NAME() to get the default schema name 


DECLARE @ID INT 

declare @SQL nvarchar(max) = 'EXEC ' + @schema +'spSelectCaseBookingDetails @BookingID = ' + CAST(@ID AS NVARCHAR(10)) 

无需投@ID如果是为nvarchar或varchar

执行(@SQL)

1

当我需要很多表名时,我有时会这样做,只是从INFORMATION_SCHEMA系统表中获取它们以及它们的模式: 值


select TABLE_SCHEMA + '.' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME in 
(*select your table names*) 

-1

尝试setuser。示例

declare @schema nvarchar (256) 
set @schema=(
    select top 1 TABLE_SCHEMA 
    from INFORMATION_SCHEMA.TABLES 
    where TABLE_NAME='MyTable' 
) 
if @schema<>'dbo' setuser @schema