установить схему по умолчанию для запроса SQL - PullRequest
54 голосов
/ 09 февраля 2011

Есть ли способ установить схему для запроса, чтобы в остальной части запроса я мог ссылаться на таблицы просто по их имени, не добавляя перед ними имя схемы?

Например, я хотел бы сделать что-то вроде этого:

Use [schemaName]
select * from [tableName]

в противоположность этому:

select * from [schemaName].[tableName]

Ответы [ 6 ]

35 голосов
/ 09 февраля 2011

Быстрый Google указал мне на эту страницу . Это объясняет, что начиная с SQL Server 2005 и далее вы можете установить схему по умолчанию для пользователя с помощью инструкции ALTER USER. К сожалению, это означает, что вы меняете его постоянно, поэтому, если вам нужно переключаться между схемами, вам нужно будет устанавливать его каждый раз при выполнении хранимой процедуры или пакета операторов. В качестве альтернативы вы можете использовать методику, описанную здесь .

Если вы используете sql server 2000 или старше , эта страница объясняет, что пользователи и схемы эквивалентны. Если вы не добавляете имя таблицы в схему \ user, сервер sql сначала просматривает таблицы, принадлежащие текущему пользователю, а затем таблицы, принадлежащие dbo, для разрешения имени таблицы. Кажется, что для всех других таблиц вы должны добавить схему \ user.

12 голосов
/ 09 февраля 2011

Я не верю, что существует способ сделать это по запросу.(Вы можете использовать ключевое слово use, чтобы указать базу данных - не схему, - но это технически отдельный запрос, поскольку вы должны выполнить команду go позже.)

Помнитев SQL-сервере полные имена таблиц имеют следующий формат:

[база данных]. [схема]. [таблица]

В SQL Server Management Studio вы можете настроитьвсе значения по умолчанию, о которых вы спрашиваете.

  • Вы можете установить значение по умолчанию database для каждого пользователя (или в строке подключения):

    Безопасность> Логины> (щелчок правой кнопкой мыши) пользователь> Свойства> Общие

  • Вы можете установить значение по умолчанию schema для каждого пользователя (но яНе думаю, что вы можете настроить его в строке подключения, хотя, если вы используете dbo, это всегда значение по умолчанию):

    Безопасность> Логины> (щелчок правой кнопкой мыши) пользователь> Свойства> Отображение пользователя> По умолчаниюСхема

Короче говоря, если вы используете dbo для своей схемы,у вас, вероятно, будет меньше головных болей.

1 голос
/ 26 сентября 2018

SETUSER может работать, имея пользователя, даже пользователя-сироту в БД с необходимой схемой по умолчанию. Но SETUSER в наследство не поддерживается навсегда. Таким образом, аналогичной альтернативой может быть установка роли приложения с необходимой схемой по умолчанию, если не требуется перекрестный доступ к БД, это должно сработать

1 голос
/ 23 января 2014

Что я иногда делаю, когда мне нужно много имен таблиц, просто получаю их плюс их схему из системной таблицы INFORMATION_SCHEMA: значение


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

0 голосов
/ 26 июля 2016

Попробуйте 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
0 голосов
/ 23 августа 2012

Другой способ добавления схемы динамически или, если вы хотите изменить ее на что-то другое

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...