Chciałbym, aby była to ostateczna dyskusja na temat sprawdzania, czy tabela istnieje w SQL Server 2000/2005 przy użyciu instrukcji SQL.
Gdy szukasz odpowiedzi na Google, dostajesz tak wiele różnych odpowiedzi. Czy istnieje oficjalny / zgodny z poprzednimi wersjami sposób?
Oto dwa możliwe sposoby zrobienia tego. Który z nich jest standardowym / najlepszym sposobem na zrobienie tego?
Pierwszy sposób:
IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
Drugi sposób:
IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
MySQL zapewnia proste
SHOW TABLES LIKE '%tablename%';
komunikat. Szukam czegoś podobnego.
Odpowiedzi:
W przypadku takich zapytań zawsze najlepiej jest użyć
INFORMATION_SCHEMA
widoku. Widoki te są (głównie) standardowe w wielu różnych bazach danych i rzadko zmieniają się z wersji na wersję.Aby sprawdzić, czy tabela istnieje, użyj:
źródło
SELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Pamiętaj również, że jeśli z jakiegoś powodu musisz sprawdzić tabelę tymczasową, możesz to zrobić:
źródło
Zawsze używamy tego
OBJECT_ID
stylu tak długo, jak pamiętamźródło
OBJECT_ID('TableName', 'U')
aby zagwarantować, że obiekt jest tabelą.IF EXISTS
zapytania z zaakceptowanej odpowiedzi w kółko. Ponadto wszystko jest tajemnicze, dopóki nie przeczytasz dokumentacji, szczególnie w języku T-SQL (lub jakimkolwiek innym wariancie).Zobacz poniższe podejścia,
Podejście 1: Korzystanie z widoku INFORMACJE_SCHEMA.TABLES
Możemy napisać zapytanie jak poniżej, aby sprawdzić, czy istnieje tabela klientów w bieżącej bazie danych.
Podejście 2: Korzystanie z funkcji OBJECT_ID ()
Możemy użyć funkcji OBJECT_ID () jak poniżej, aby sprawdzić, czy istnieje tabela klientów w bieżącej bazie danych.
Podejście 3: Korzystanie z widoku katalogu sys.Objects
Możemy użyć widoku katalogu Sys.Objects, aby sprawdzić istnienie tabeli, jak pokazano poniżej:
Podejście 4: Korzystanie z widoku katalogu sys.Tables
Możemy użyć widoku katalogu Sys.Tables, aby sprawdzić istnienie tabeli, jak pokazano poniżej:
Podejście 5: Unikaj używania tabeli systemowej sys.sysobjects
Powinniśmy unikać bezpośredniego używania tabeli systemowej sys.sysobjects, bezpośredni dostęp do niej będzie przestarzały w niektórych przyszłych wersjach Sql Server. Zgodnie z linkiem Microsoft BOL, Microsoft sugeruje użycie widoków katalogu sys.objects / sys.tables zamiast bezpośrednio tabeli systemowej sys.sysobjects.
odesłany z: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
źródło
Szukasz tabeli w innej bazie danych:
źródło
Chciałem tylko wspomnieć o jednej sytuacji, w której prawdopodobnie łatwiej byłoby użyć tej
OBJECT_ID
metody. TeINFORMATION_SCHEMA
widoki są obiektami pod każdym od bazy danychhttps://msdn.microsoft.com/en-us/library/ms186778.aspx
Dlatego wszystkie tabele, do których uzyskujesz dostęp
odzwierciedla tylko to, co jest w środku
[database]
. Jeśli chcesz sprawdzić, czy tabele w innej bazie danych istnieją, bez dynamicznej zmiany za[database]
każdym razem,OBJECT_ID
pozwoli ci to zrobić od razu po wyjęciu z pudełka. Dawny-działa równie dobrze jak
SQL SERVER 2016 Edycja :
Począwszy od 2016 r. Microsoft uprościł możliwość sprawdzania nieistniejących obiektów przed usunięciem, dodając
if exists
słowa kluczowe dodrop
instrukcji. Na przykład,zrobi to samo co
OBJECT_ID
/INFORMATION_SCHEMA
wrappers, w 1 linii kodu.https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
źródło
źródło
Używanie schematu informacyjnego jest standardowym sposobem SQL, więc należy go używać we wszystkich bazach danych, które go obsługują.
źródło
W powyższym kodzie nazwa tabeli to
Mapping_APCToFANavigator
.źródło
{ }
) na pasku narzędzi edytora, aby ładnie format i składnia go podświetlić!Jeśli musisz pracować na różnych bazach danych:
źródło
Wiem, że to stare pytanie, ale znalazłem taką możliwość, jeśli planujesz często dzwonić.
źródło
sysname
typu danychvarchar(50)
. Nie należy używać przestarzałegosysobjects
widoku i nie uwzględnia schematu.Możesz użyć poniższego kodu
Lub
źródło
Właśnie dodam tutaj, z korzyścią dla programistów i innych DBA
skrypt, który odbiera @Tablename jako parametr
(który może zawierać lub nie zawierać nazwy schematu) i zwraca poniższe informacje, jeśli istnieje tabela schematu:
Stworzyłem ten skrypt do użycia w innych skryptach za każdym razem, gdy muszę przetestować, czy istnieje tabela lub widok, a kiedy już istnieje, pobierz jej identyfikator_obiektu do innych celów.
Zgłasza błąd, gdy przekazujesz pusty ciąg, niepoprawną nazwę schematu lub niewłaściwą nazwę tabeli.
może to być na przykład procedura i zwracać -1.
Jako przykład mam tabelę „Facts.FactBackOrder” w jednej z moich baz danych hurtowni danych.
Oto jak to osiągnąłem:
źródło
dbo.[hello.world ]
a skrypt nie znalazłby jej z wielu powodów. To powiedziawszy, jest mało prawdopodobne, aby ktoś chciał stworzyć taki stół, ale nadal. W każdym razie twojaTHE_NAME
kolumna jest zdefiniowana jakosysname', yet you try to squeeze 2
kolumny sysname` i kropka (.
), wszystkie otoczone nawiasami kwadratowymi ... że pewnego dnia jedna z nich zawiedzie!W SQL Server 2000 możesz spróbować:
źródło
źródło
Coś ważnego dla każdego, kto jeszcze nie znalazł rozwiązania: SQL Server! = MYSQL . Jeśli chcesz to zrobić za pomocą MySQL , jest to dość proste
Publikowanie tego tutaj, ponieważ jest to największy hit w Google.
źródło
źródło
Możesz użyć tego:
źródło
źródło
- - utwórz procedurę sprawdzania, czy tabela istnieje
- - jak używać: sprawdź, czy istnieją migracje tabel
źródło
źródło
biorę tutaj, tworząc widok jako przykład .
Ponieważ polecenia ALTER / CREATE nie mogą znajdować się w blokach BEGIN / END. Musisz przetestować istnienie i upuścić je przed utworzeniem
Jeśli obawiasz się utraty uprawnień, możesz również napisać skrypt instrukcji GRANT i ponownie uruchomić je na końcu.
Możesz owinąć create / alter w ciąg i wykonać EXEC - co może być brzydkie w przypadku dużych widoków
źródło
Jeśli ktoś próbuje zrobić to samo w Linq na sql (a szczególnie Linqpad), włącz opcję dołączania tabel systemowych i widoków i wykonaj ten kod:
biorąc pod uwagę, że masz obiekt o nazwie we właściwości o nazwie item oraz schemat we właściwości o nazwie schemat, w którym nazwa zmiennej źródłowej to
a
źródło
Jeśli ma to być „ostateczna” dyskusja, należy zauważyć, że skrypt Larry'ego Leonarda może również wysyłać zapytania do zdalnego serwera, jeśli serwery są połączone.
źródło
Miałem pewne problemy z wybraniem spośród INFORMAL_SCHEME i OBJECT_ID. Nie wiem, czy jest to problem ze sterownikiem ODBC czy coś takiego. Zapytania ze studia zarządzania SQL, oba były w porządku.
Oto rozwiązanie:
Jeśli więc zapytanie nie powiedzie się, prawdopodobnie nie ma takiej tabeli w bazie danych (lub nie masz do niej uprawnień dostępu).
Sprawdzanie odbywa się poprzez porównanie wartości (w moim przypadku liczby całkowitej) zwróconej przez executor SQL, który zajmuje się sterownikiem ODBC.
źródło
Jest jeszcze jedna opcja, aby sprawdzić, czy tabela istnieje między bazami danych
źródło
Uruchom to zapytanie, aby sprawdzić, czy tabela istnieje w bazie danych:
źródło
weź pod uwagę, że w jednej bazie danych masz tabelę t1. chcesz uruchomić skrypt na innej bazie danych, na przykład - jeśli t1 istnieje, nie rób nic więcej, twórz t1. Aby zrobić to otwarte studio wizualne i wykonaj następujące czynności:
Kliknij prawym przyciskiem myszy t1, następnie Skrypt tabeli jako, następnie DROP i Utwórz do, a następnie Nowy edytor zapytań
znajdziesz żądane zapytanie. Ale przed uruchomieniem tego skryptu nie zapomnij skomentować instrukcji drop w zapytaniu, ponieważ nie chcesz tworzyć nowego, jeśli już istnieje.
Dzięki
źródło