设置sql查询的默认架构

设置sql查询的默认架构,sql,sql-server,schema,Sql,Sql Server,Schema,有没有一种方法可以设置查询的模式,以便在查询的其余部分中,我可以只按表的名称引用表,而不必在表的前面加上模式名称 例如,我想做这样的事情: Use [schemaName] select * from [tableName] 与此相反: select * from [schemaName].[tableName] 我不相信有一个每查询的方式来做到这一点。您可以使用use关键字指定数据库,而不是模式,但从技术上讲,这是一个单独的查询,因为您必须在之后发出go命令 请记住,在SQL server

有没有一种方法可以设置查询的模式,以便在查询的其余部分中,我可以只按表的名称引用表,而不必在表的前面加上模式名称

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

Use [schemaName]
select * from [tableName]
与此相反:

select * from [schemaName].[tableName]

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

请记住,在SQL server中,完全限定表名称的格式如下:

[数据库].[架构].[表]

在SQLServerManagementStudio中,您可以配置所询问的所有默认设置

您可以基于每个用户或在连接字符串中设置默认数据库:

安全性>登录>右键单击用户>属性>常规

您可以按每个用户设置默认模式,但我不相信您可以在连接字符串中配置它,尽管如果使用dbo,这始终是默认模式:

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


简言之,如果您在模式中使用dbo,您可能会有最少的麻烦。

一个快速的google指向我。它解释了从SQLServer2005开始,您可以使用ALTERUSER语句设置用户的默认模式。不幸的是,这意味着要永久地更改它,因此如果需要在模式之间切换,则每次执行存储过程或一批语句时都需要设置它。或者,您可以使用所描述的技术


如果您使用的是sql server 2000或更早版本,则说明用户和模式是等效的。如果不在表名前加schema\user,sql server将首先查看当前用户拥有的表,然后查看dbo拥有的表,以解析表名。似乎对于所有其他表,都必须预先添加schema\user。

另一种动态添加schema的方法,或者如果您想将其更改为其他方式

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

当我需要很多表名时,我有时会执行的操作我只需要从INFORMATION_schema system表中获取它们和它们的模式: 价值观

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

SETUSER可以工作,在数据库中有一个用户,甚至是一个孤立的用户,并具有所需的默认模式。但SETUSER位于“永远不支持的旧版”列表中。因此,类似的替代方案是使用所需的默认模式设置应用程序角色,只要不需要跨数据库访问,这应该可以很好地发挥作用。

非常古老的问题,但由于google引导我来到这里,我将添加一个我认为有用的解决方案:

第一步。为您需要能够使用的每个架构创建一个用户。例如,用户_myschema

第二步。使用EXECUTE AS以所需架构用户的身份执行SQL语句

第三步。使用“还原”切换回原始用户

例如: 假设您在schema otherschema中有一个表mytable,它不是您的默认模式。从mytable运行SELECT*将不起作用

创建名为user_otherschema的用户,并将该用户的默认架构设置为otherschema

现在,您可以运行此脚本与表进行交互:

EXECUTE AS USER = 'user_otherschema';
SELECT * FROM mytable
REVERT
revert语句重置当前用户,这样您就又恢复了自我


链接以文档形式执行:

对于Oracle,请使用以下简单命令:


ALTER SESSION SET current_schema=不带引号的模式

指向您的数据库名称并选择SQLMS中的新查询。使用DBNAME;从[Tablename]中选择*是正确的。这使我得到了所需的答案。结果表明,如果用户是SysAdmin固定服务器角色的成员,则默认架构将被忽略。它只是使用dbo…我不认为这符合OP的要求。似乎是要更改当前用户,而不是当前架构。此外,链接文档暗示它已被弃用……因此每个用户都有一个默认模式,直到知道才知道。谢谢
EXECUTE AS USER = 'user_otherschema';
SELECT * FROM mytable
REVERT