Jeśli kiedykolwiek będziesz musiał znaleźć wszystkie tabele, które mają klucz podstawowy w SQL Server, ten artykuł może pomóc.
W tym artykule przedstawiono siedem sposobów zwracania wszystkich tabel w bieżącej bazie danych, które mają klucz podstawowy.
Zauważ, że większość z tych przykładów zwraca tylko tabele – nie same klucze podstawowe. Jeśli chcesz uzyskać listę kluczy podstawowych, zobacz 11 sposobów na zwrócenie klucza głównego w SQL Server.
Opcja 1 – OBJECTPROPERTY() z sys.tables
Pierwsza opcja obejmuje użycie OBJECTPROPERTY()
funkcja podczas odpytywania sys.tables
widok systemu. Ta funkcja akceptuje TableHasPrimaryKey
argument. Jeśli ten argument ma wartość 1
, otrzymujemy wszystkie tabele, które mają klucz podstawowy (jeśli jest to 0
wtedy otrzymujemy wszystkie tabele, które nie mają klucza podstawowego).
SELECT SCHEMA_NAME (schema_id) AS [Schema], nazwa AS [Table] FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =1ORDER BY [Schema], [Table];
Wynik:
+----------+---------+| Schemat | Tabela ||----------+---------|| dbo | Albumy || dbo | Artyści || dbo | Kraj || dbo | Gatunki |+----------+---------+
W tym przykładzie bieżąca baza danych zawiera cztery tabele z kluczem podstawowym.
Pozostałe przykłady będą wysyłać zapytania do tej samej bazy danych, więc wyniki będą takie same dla tych zapytań.
Opcja 2 – OBJECTPROPERTY() z INFORMATION_SCHEMA.TABLES
W tym przykładzie użyto OBJECTPROPERTY()
ponownie, ale tym razem pytam o INFORMATION_SCHEMA.TABLES
widok.
SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME))),'TableHasPrimaryKey') =1 ANDTABLE_TYPE='BASE TABLE'ORDER BY TABLE_SCHEMA;Wynik:
+----------------+--------------+| TABLE_SCHEMA | TABLE_NAME ||----------------+---------------|| dbo | Albumy || dbo | Artyści || dbo | Kraj || dbo | Gatunki |+----------------+--------------+
Opcja 3 – OBJECTPROPERTY() z sys.objects
Jeszcze raz OBJECTPROPERTY()
przychodzi na ratunek. Tym razem pytam o sys.objects
widok systemu.
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table]FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', nazwa)), 'TableHasPrimaryKey ') =1ORDER BY [Schema], [Tabela]
Wynik:
+----------+---------+| Schemat | Tabela ||----------+---------|| dbo | Albumy || dbo | Artyści || dbo | Kraj || dbo | Gatunki |+----------+---------+
Opcja 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS
Możesz zapytać o INFORMATION_SCHEMA.TABLE_CONSTRAINTS
widok, aby uzyskać listę tabel z kluczami podstawowymi. Musisz filtrować wyniki tylko do tych wierszy, które mają CONSTRAINT_TYPE
z PRIMARY KEY
.
SELECT CONSTRAINT_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='KLUCZ PODSTAWOWY';
Wynik:
+---------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+---------------|| dbo | Artyści || dbo | Gatunki || dbo | Albumy || dbo | Kraj |+---------------------+--------------+
Ten widok zwraca również nazwę ograniczenia, więc w razie potrzeby możesz również dołączyć tę kolumnę:
SELECT CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='KLUCZ PODSTAWOWY';
Wynik:
+----------+--------------+------------- -----------------------+| CONSTRAINT_SCHEMA | TABLE_NAME | CONSTRAINT_NAME ||----------+---------------+---------- ---------------------|| dbo | Artyści | PK__Artyści__25706B50FCD918B1 || dbo | Gatunki | PK__Gatunki__0385057E88BB96F8 || dbo | Albumy | PK__Albumy__97B4BE379FC780BD || dbo | Kraj | PK__Kraj__10D1609F97ADEC31 |+----------+-----------------+---------- ---------------------+
Opcja 5 – sys.key_constraints
Możesz filtrować sys.key_constraints
wyświetl CONSTRAINT_TYPE
z PK
aby uzyskać listę tabel z kluczami podstawowymi.
SELECT SCHEMA_NAME (schema_id) AS [Schema], OBJECT_NAME (parent_object_id) AS [Tabela] FROM sys.key_constraints WHERE type =„PK”;
Wynik:
+----------+---------+| Schemat | Tabela ||----------+---------|| dbo | Artyści || dbo | Gatunki || dbo | Albumy || dbo | Kraj |+----------+---------+
Oto znowu z nazwą klucza podstawowego:
SELECT SCHEMA_NAME (schema_id) AS [Schema], OBJECT_NAME (parent_object_id) AS [Tabela], nameFROM sys.key_constraints WHERE type ='PK';
Wynik:
+-----------+---------+------------------------------ ------+| Schemat | Tabela | nazwa ||----------+------------+-------------------------- -----|| dbo | Artyści | PK__Artyści__25706B50FCD918B1 || dbo | Gatunki | PK__Gatunki__0385057E88BB96F8 || dbo | Albumy | PK__Albumy__97B4BE379FC780BD || dbo | Kraj | PK__Kraj__10D1609F97ADEC31 |+----------+-------------+-------------------------- -----+
Opcja 6 – sys.objects
sys.objects
Widok systemowy jest popularnym sposobem zwracania informacji o obiektach o zakresie schematu, w tym o kluczach podstawowych.
SELECT SCHEMA_NAME (schema_id) AS [Schema], OBJECT_NAME (parent_object_id) AS [Tabela] FROM sys.objects WHERE typ =„PK”;
Wynik:
+----------+---------+| Schemat | Tabela ||----------+---------|| dbo | Artyści || dbo | Gatunki || dbo | Albumy || dbo | Kraj |+----------+---------+
Podobnie jak w poprzednich dwóch przykładach, możemy dołączyć name
kolumny tego widoku, aby wyświetlić nazwę klucza podstawowego:
SELECT SCHEMA_NAME (schema_id) AS [Schema], OBJECT_NAME (parent_object_id) AS [Tabela], nameFROM sys.objects WHERE typ =„PK”;
Wynik:
+-----------+---------+------------------------------ ------+| Schemat | Tabela | nazwa ||----------+------------+-------------------------- -----|| dbo | Artyści | PK__Artyści__25706B50FCD918B1 || dbo | Gatunki | PK__Gatunki__0385057E88BB96F8 || dbo | Albumy | PK__Albumy__97B4BE379FC780BD || dbo | Kraj | PK__Kraj__10D1609F97ADEC31 |+----------+-------------+-------------------------- -----+
Opcja 7 – OBJECTPROPERTYEX()
OBJECTPROPERTYEX()
funkcja działa tak samo jak OBJECTPROPERTY()
funkcja, z wyjątkiem tego, że obsługuje więcej właściwości. Dlatego każdy z poprzednich przykładów, w których użyto OBJECTPROPERTY()
, można łatwo przepisać, aby użyć OBJECTPROPERTYEX()
.
Na przykład mógłbym przepisać pierwszy przykład na tej stronie w następujący sposób:
SELECT SCHEMA_NAME (schema_id) AS [Schema], nazwa AS [Tabela] FROM sys.tablesWHERE OBJECTPROPERTYEX(object_id, 'TableHasPrimaryKey') =1ORDER BY [Schema], [Tabela];
Wynik:
+----------+---------+| Schemat | Tabela ||----------+---------|| dbo | Albumy || dbo | Artyści || dbo | Kraj || dbo | Gatunki |+----------+---------+
Powinienem wspomnieć, że OBJECTPROPERTYEX()
zwraca sql_variant typ danych, natomiast OBJECTPROPERTY()
zwraca int .