为SQL查询设置默认模式

有没有办法为查询设置模式,以便在查询的其余部分中,我可以仅仅通过名称来引用表,而不必在模式名前添加它们?

例如,我想要做这样的事情:

Use [schemaName] select * from [tableName] 

而不是这个:

 select * from [schemaName].[tableName] 

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

如果您使用的是SQL Server 2000或更早版本,则此页面将解释用户和模式是相同的。 如果不用schema \ user预先指定表名,sql server将首先查看当前用户拥有的表,然后查看dbo拥有的表来parsing表名。 看起来,对于所有其他表,您必须预先安排架构\用户。

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

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

[数据库]。[模式] [表]

在SQL Server Management Studio中,您可以configuration您所要求的所有默认值。

  • 您可以基于每个用户(或连接string)设置默认database

    安全>login>(右键单击)用户>属性>常规

  • 你可以在每个用户的基础上设置默认schema (但我不相信你可以在你的连接string中进行configuration,但是如果你使用默认的dbo ):

    安全>login>(右键单击)用户>属性>用户映射>默认架构

简而言之,如果您使用dbo作为您的模式,您可能会有最less的头痛。

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

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

dynamic添加模式的另一种方法,或者如果你想把它改成别的东西

 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)) 

如果是nvarchar或varchar,则不需要转换@ID

执行(@SQL)

尝试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