有没有一种方法可以设置查询的模式,以便在其余查询中我可以仅按表名引用表,而无需在表名前添加表名?
例如,我想做这样的事情:
Use [schemaName]
select * from [tableName]
与此相反:
select * from [schemaName].[tableName]
Answers:
我不相信有“按查询”的方式来执行此操作。(您可以使用use
关键字指定数据库,而不是模式),但是从技术上讲,这是一个单独的查询,因为您以后必须发出go
命令。)
请记住,在SQL Server中,标准表名称的格式为:
[数据库]。[模式]。[表]
在SQL Server Management Studio中,您可以配置要查询的所有默认值。
您可以database
基于每个用户(或在您的连接字符串中)设置默认值:
安全性>登录名>(右键单击)用户>属性>常规
您可以schema
按用户设置默认值(但我不相信您可以在连接字符串中对其进行配置,尽管如果dbo
始终使用默认值):
安全性>登录名>(右键单击)用户>属性>用户映射>默认架构
简而言之,如果您将其dbo
用于架构,则头痛的可能性最少。
很老的问题了,但是自从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/zh-cn/sql/t-sql/statements/execute-as-transact-sql? view = sql-server- 2017
动态添加架构的另一种方式,或者如果您想将其更改为其他方式
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)