为SQL查询设置默认架构


68

有没有一种方法可以设置查询的模式,以便在其余查询中我可以仅按表名引用表,而无需在表名前添加表名?

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

Use [schemaName]
select * from [tableName]

与此相反:

select * from [schemaName].[tableName]

1
指向您的数据库名称,然后在SQLMS中选择新查询。使用DBNAME;从[表名]中选择*是正确的。
Crimsonland'2

Answers:


37

一个快速的谷歌把我指向了这个页面。它说明从sql server 2005开始,您可以使用ALTER USER语句设置用户的默认架构。不幸的是,这意味着您将对其进行永久更改,因此,如果需要在模式之间进行切换,则每次执行存储过程或一批语句时都需要进行设置。或者,您可以使用此处描述的技术。

如果您使用的是sql server 2000或更早版本,则此页面说明用户和架构是等效的。如果您的表名前面没有schema \ user,则sql server将首先查看当前用户拥有的表,然后查看dbo拥有的表来解析表名。似乎对于所有其他表,您必须在schema \ user之前。


1
这使我得到了所需的答案。原来,如果用户是SysAdmin固定服务器角色的成员,则将忽略默认架构。它只是使用dbo ...
ShaneBlake 2015年

19

我不相信有“按查询”的方式来执行此操作。(您可以使用use关键字指定数据库,而不是模式),但是从技术上讲,这是一个单独的查询,因为您以后必须发出go命令。)

请记住,在SQL Server中,标准表名称的格式为:

[数据库]。[模式]。[表]

在SQL Server Management Studio中,您可以配置要查询的所有默认值。

  • 您可以database基于每个用户(或在您的连接字符串中)设置默认值:

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

  • 您可以schema按用户设置默认值(但我不相信您可以在连接字符串中对其进行配置,尽管如果dbo始终使用默认值):

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

简而言之,如果您将其dbo用于架构,则头痛的可能性最少。


7

很老的问题了,但是自从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


所以每个用户都有一个默认的架构,直到知道才知道。谢谢。
pein-consulting.de

2

当我需要大量表名时,有时我会做什么,只需从INFORMATION_SCHEMA系统表中获取它们及其架构即可:value


select  TABLE_SCHEMA + '.' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME in
(*select your table names*)


1

SETUSER可以工作,在数据库中有一个用户,甚至是孤立的用户(具有所需的默认模式)。但是SETUSER永远不会支持旧版列表。因此,类似的替代方法是使用所需的默认架构设置应用程序角色,只要不需要跨数据库访问,就应该像对待一样。


-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

我认为这不符合OP的要求。SETUSER似乎是要更改当前用户,而不是当前架构。此外,链接的文档暗示它已被弃用……
2016年

-2

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

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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.