2011-02-09 5 views
42

Czy istnieje sposób ustawienia schematu kwerendy, aby w pozostałej części kwerendy można było odwoływać się do tabel tylko po nazwie bez poprzedzania ich nazwą schematu?ustaw domyślny schemat kwerendy sql

Na przykład, chciałbym zrobić coś takiego:

Use [schemaName] 
select * from [tableName] 

w przeciwieństwie do tego:

select * from [schemaName].[tableName] 
+1

Wskaż nazwę bazy danych i wybierz nowe zapytanie w SQLMS. Użyj DBNAME; Wybierz * z [Nazwa tablicy] jest poprawne. – Crimsonland

Odpowiedz

30

Szybki google wskazał mi na this page. Wyjaśnia, że ​​począwszy od serwera SQL 2005 można ustawić domyślny schemat użytkownika za pomocą instrukcji ALTER USER. Niestety oznacza to, że zmieniasz go na stałe, więc jeśli chcesz przełączać się między schematami, musisz ustawić go za każdym razem, gdy wykonywana jest procedura składowana lub partia instrukcji. Alternatywnie możesz użyć techniki opisanej pod numerem here.

Jeśli używasz serwera sql 2000 lub starszego this page wyjaśnia, że ​​użytkownicy i schematy są wtedy równoważne. Jeśli nie dodasz nazwy tabeli do schematu \ user, serwer SQL najpierw przejrzy tabele posiadane przez bieżącego użytkownika, a następnie te należące do dbo, aby rozwiązać nazwę tabeli. Wydaje się, że dla wszystkich innych tabel należy poprzedzić schemat \ użytkownik.

+0

Tego właśnie szukałem. Dziękuję Ci. – Chev

+0

To doprowadziło mnie do odpowiedzi, której potrzebowałem. Okazuje się, że domyślny schemat jest ignorowany, jeśli użytkownik jest członkiem stałej roli serwera SysAdmin. Po prostu używa dbo ... – ShaneBlake

11

nie wierzę, że jest "za zapytania" sposób to zrobić . (Można użyć słowa kluczowego use określić bazy - nie jest schemat - ale to technicznie oddzielne zapytania jak masz wydać komendę go potem.)

Pamiętaj, że w serwerze SQL w pełni kwalifikowane nazwy tabel są w format:..

[database] [schemat] [tabela]

W SQL Server Management Studio można skonfigurować wszystkie ustawienia domyślne pytasz o.

  • Można ustawić domyślną database na poszczególnych użytkowników (lub w ciągu połączenia):

    Zabezpieczenia> logowania> (prawy przycisk myszy) użytkownika> Właściwości> Ogólne

  • Możesz ustawić domyślny schema dla każdego użytkownika (ale nie sądzę, że możesz go skonfigurować w łańcuchu połączenia, ale jeśli użyjesz dbo, który jest zawsze domyślny):

    Bezpieczeństwo> logowania> (prawy przycisk myszy) user> Właściwości> User Mapping> Default Schema

W skrócie, jeśli używasz dbo do schematu, to często mają najmniej ilość bólów głowy.

0

Innym sposobem dodawania schematu dynamicznie lub jeśli u chcą go zmienić na coś innego

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)) 

Nie ma potrzeby, aby rzucić @ID jeśli jest nvarchar lub varchar

execute (@SQL)

1

Co czasami robię, gdy potrzebuję dużo nazw tablicames, po prostu pobierz je wraz z ich schematem z tabeli systemowej INFORMATION_SCHEMA: wartość


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

-1

Spróbuj setuser. Przykład

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

Nie sądzę, że robi to, o co prosi OP. [SETUSER] (https://msdn.microsoft.com/en-us/library/ms186297.aspx) wydaje się zmieniać obecnego użytkownika, a nie aktualny schemat. Ponadto powiązana dokumentacja implikuje, że jest przestarzała ... – Will