设置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