有没有一种方法可以设置查询的架构,以便在查询的其余部分中我可以仅通过名称引用表,而无需在它们前面添加架构名称?
例如,我想做这样的事情:
Use [schemaName]
select * from [tableName]
与此相反:
select * from [schemaName].[tableName]
我不相信有“每个查询”的方法可以做到这一点。 (您可以使用
use
关键字来指定 database - 而不是模式 - 但从技术上讲,这是一个单独的查询,因为您必须随后发出 go
命令。)
请记住,在 SQL Server 中,完全限定表名称的格式为:
[数据库].[架构].[表]
在 SQL Server Management Studio 中,您可以配置您所询问的所有默认值。
您可以为每个用户(或在连接字符串中)设置默认值
database
:
安全 > 登录 >(右键单击)用户 > 属性 > 常规
您可以为每个用户设置默认的
schema
(但我不相信您可以在连接字符串中配置它,尽管如果您使用dbo
,则始终是默认值):
安全 > 登录 >(右键单击)用户 > 属性 > 用户映射 > 默认架构
简而言之,如果您使用
dbo
作为您的模式,您可能会遇到最少的头痛。
非常老的问题,但由于谷歌引导我来到这里,我将添加一个我发现有用的解决方案:
步骤 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
恢复语句会重置当前用户,让你再次成为你自己。
EXECUTE AS 文档的链接:https://learn.microsoft.com/en-us/sql/t-sql/statements/execute-as-transact-sql?view=sql-server-2017
当我需要大量表名时,我有时会从
INFORMATION_SCHEMA
系统表中获取它们及其架构:
价值
select TABLE_SCHEMA + '.' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME in
(*select your table names*)
SETUSER 可以工作,拥有一个用户,甚至是数据库中具有所需默认模式的孤立用户。但 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
动态添加架构的另一种方法,或者如果您想将其更改为其他内容
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)
对于 Oracle,请使用这个简单的命令:
ALTER SESSION SET current_schema = your-schema-without-quotes;