Możesz użyć OBJECTPROPERTY()
funkcji w SQL Server, aby sprawdzić, czy obiekt jest tabelą zdefiniowaną przez użytkownika, czy nie.
Aby to zrobić, przekaż identyfikator obiektu jako pierwszy argument, a IsUserTable
jako drugi argument. Funkcja zwraca 1
lub 0
w zależności od tego, czy jest to tabela zdefiniowana przez użytkownika.
Zwracana wartość 1
oznacza, że jest tabela zdefiniowana przez użytkownika i wartość 0
oznacza, że tak nie jest.
Przykład 1 – Podstawowe użycie
Oto krótki przykład do zademonstrowania.
USE WideWorldImportersDW; SELECT OBJECTPROPERTY(1013578649, 'IsUserTable') AS [IsUserTable];
Wynik:
+---------------+ | IsUserTable | |---------------| | 1 | +---------------+
W tym przypadku WideWorldImportersDW baza danych zawiera obiekt z podanym identyfikatorem i jest to tabela zdefiniowana przez użytkownika.
Przykład 2 – Uzyskanie identyfikatora obiektu
Jeśli znasz nazwę obiektu, ale nie znasz jego identyfikatora, możesz użyć OBJECT_ID()
funkcja do pobrania identyfikatora na podstawie jego nazwy.
Przykład:
SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsUserTable') AS [IsUserTable];
Wynik:
+---------------+ | IsUserTable | |---------------| | 1 | +---------------+
Jest to ten sam obiekt z poprzedniego przykładu.
Tutaj znowu jest z wyjściem ID oddzielnie.
SELECT OBJECT_ID('Dimension.City') AS [Object ID], OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsUserTable') AS [IsUserTable];
Wynik:
+-------------+---------------+ | Object ID | IsUserTable | |-------------+---------------| | 1013578649 | 1 | +-------------+---------------+
Przykład 3 – gdy obiekt NIE jest tabelą zdefiniowaną przez użytkownika
Oto, co się dzieje, gdy obiekt nie jest tabelą użytkownika.
SELECT OBJECTPROPERTY(402100473, 'IsUserTable') AS [IsUserTable];
Wynik:
+---------------+ | IsUserTable | |---------------| | 0 | +---------------+
W takim przypadku baza danych tak mam obiekt o tym identyfikatorze, ale obiekt jest w rzeczywistości procedurą składowaną (nie tabelą zdefiniowaną przez użytkownika), więc otrzymuję wynik negatywny.
Tutaj znowu używamy OBJECT_ID()
.
SELECT OBJECT_ID('Sequences.ReseedAllSequences') AS [Object ID], OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'IsUserTable') AS [IsUserTable], OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'IsProcedure') AS [IsProcedure];
Wynik:
+-------------+---------------+---------------+ | Object ID | IsUserTable | IsProcedure | |-------------+---------------+---------------| | 402100473 | 0 | 1 | +-------------+---------------+---------------+
Sprawdziłem również, czy obiekt jest procedurą składowaną i wynik jest pozytywny.
Przykład 4 – Obiekt nie istnieje
SQL Server zakłada, że identyfikator obiektu znajduje się w bieżącym kontekście bazy danych. Jeśli przekażesz identyfikator obiektu z innej bazy danych, otrzymasz wynik NULL lub otrzymasz nieprawidłowe wyniki.
SELECT OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'IsUserTable') AS [InvalidObject], OBJECTPROPERTY(12345678, 'IsUserTable') AS [12345678];
Wynik:
+-----------------+------------+ | InvalidObject | 12345678 | |-----------------+------------| | NULL | NULL | +-----------------+------------+
W tym przypadku baza danych nie zawiera obiektów o tej nazwie lub identyfikatorze, więc otrzymuję wynik NULL.
Otrzymasz również NULL w przypadku błędu lub braku uprawnień do przeglądania obiektu.