有没有办法为查询设置架构,以便在查询的其余部分中我可以仅通过名称引用表而不用模式名称添加它们?
例如,我想做这样的事情:
Use [schemaName]
select * from [tableName]
与此相反:
select * from [schemaName].[tableName]
答案 0 :(得分:35)
快速谷歌指出我this page。它解释了从sql server 2005开始,您可以使用ALTER USER语句设置用户的默认架构。不幸的是,这意味着您永久地更改它,因此如果您需要在模式之间切换,则需要在每次执行存储过程或一批语句时进行设置。或者,您可以使用here描述的技术。
如果您使用的是sql server 2000或更早版本this page,则说明用户和模式是等效的。如果不在schema \ user之前添加表名,sql server将首先查看当前用户拥有的表,然后查看dbo拥有的表以解析表名。似乎对于所有其他表,您必须添加schema \ user。
答案 1 :(得分:12)
我不相信有“每个查询”的方式来做到这一点。 (您可以使用use
关键字指定数据库 - 而不是模式 - 但从技术上讲,这是一个单独的查询,因为您之后必须发出go
命令。)
请记住,在SQL Server中,完全限定的表名格式为:
[数据库]。[模式] [表]
在SQL Server Management Studio中,您可以配置所询问的所有默认值。
您可以基于每个用户(或连接字符串)设置默认database
:
安全>登录> (右键单击)用户>属性>一般
您可以基于每个用户设置默认schema
(但我不相信您可以在连接字符串中配置它,尽管如果您使用dbo
总是如此默认):
安全>登录> (右键单击)用户>属性>用户映射>默认架构
简而言之,如果您使用dbo
作为架构,那么您可能会遇到最少的麻烦。
答案 2 :(得分:1)
当我需要大量的表名时,我有时会做什么只是从INFORMATION_SCHEMA系统表中获取它们的模式: 值
select TABLE_SCHEMA + '.' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME in
(*select your table names*)
答案 3 :(得分:1)
SETUSER可以正常工作,在数据库中有一个用户,甚至是一个孤立的用户(具有所需的默认模式)。但是SETUSER是永远不支持的列表。因此,类似的替代方法是使用所需的默认架构设置应用程序角色,只要不需要跨数据库访问,这应该可以解决问题
答案 4 :(得分:1)
一个很老的问题,但是由于google在这里率领我,我将添加一个我认为有用的解决方案:
步骤1.为需要使用的每个架构创建一个用户。例如。 “ user_myschema”
步骤2。使用EXECUTE AS以所需的模式用户执行SQL语句。
第3步。使用REVERT切换回原始用户。
示例: 假设您在架构“ otherschema”中存在一个表“ mytable”,这不是您的默认架构。运行“ SELECT * FROM mytable”将不起作用。
创建一个名为“ user_otherschema”的用户,并将该用户的默认架构设置为“ otherschema”。
现在,您可以运行此脚本与表进行交互:
EXECUTE AS USER = 'user_otherschema';
SELECT * FROM mytable
REVERT
revert语句将重置当前用户,所以您又是您自己。
链接到EXECUTE AS文档:https://docs.microsoft.com/en-us/sql/t-sql/statements/execute-as-transact-sql?view=sql-server-2017
答案 5 :(得分:0)
对于 Oracle,请使用这个简单的命令:
ALTER SESSION SET current_schema = your-schema-without-quotes;
答案 6 :(得分:-1)
另一种动态添加模式的方法,或者如果你想将其更改为其他方式
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)
答案 7 :(得分:-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