Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

3 façons de compter le nombre de tables système dans une base de données SQL Server

Voici un article qui présente trois façons de déterminer rapidement le nombre de tables système dans la base de données actuelle dans SQL Server.

Les trois options utilisent le COUNT() fonction lors de l'interrogation de sys.objects vue du catalogue système. Ils aboutissent tous au même résultat, vous n'avez donc vraiment pas besoin de dépasser la première option. Mais je vais quand même les énumérer.

Option 1 – Par type

La façon la plus concise de le faire est de filtrer par le type colonne.

USE Music;
SELECT COUNT(*) AS [Number of System Tables]
FROM sys.objects 
WHERE type = 'S';

Résultat :

+---------------------------+
| Number of System Tables   |
|---------------------------|
| 72                        |
+---------------------------+

Ici, je filtre par un type de S . Le S signifie "Table de base du système".

Si je passe au maître base de données, j'obtiens un résultat différent :

USE Master;
SELECT COUNT(*) AS [Number of System Tables]
FROM sys.objects 
WHERE type = 'S';

Résultat :

+---------------------------+
| Number of System Tables   |
|---------------------------|
| 79                        |
+---------------------------+

C'est parce que le maître La base de données contient des tables système qui ne se trouvent pas dans d'autres bases de données.

Nous pouvons exécuter la requête suivante pour obtenir les noms :

USE master;
SELECT name 
FROM sys.objects
WHERE type = 'S' 
AND name NOT IN (
  SELECT name FROM model.sys.objects WHERE type = 'S' 
);

Résultat :

+--------------------------+
| name                     |
|--------------------------|
| sysextendedrecoveryforks |
| syslogshippers           |
| sysmatrixageforget       |
| sysmatrixages            |
| sysmatrixbricks          |
| sysmatrixconfig          |
| sysmatrixmanagers        |
+--------------------------+

Dans ce cas, je compare le maître base de données au modèle base de données. Vous pouvez explicitement spécifier une base de données différente en échangeant model avec le nom de l'autre base de données.

Option 2 - Par "Description du type"

Une autre option consiste à filtrer par le type_desc colonne au lieu du type colonne.

USE Music;
SELECT COUNT(*) AS [Number of System Tables]
FROM sys.objects 
WHERE type_desc = 'SYSTEM_TABLE';

Résultat :

+---------------------------+
| Number of System Tables   |
|---------------------------|
| 72                        |
+---------------------------+

Option 3 - Par OBJECTPROPERTY()

Si pour une raison quelconque vous trouvez que les deux options précédentes ne conviennent pas, vous pouvez essayer d'utiliser le OBJECTPROPERTY() une fonction.

Cette fonction accepte deux arguments :un ID d'objet et une propriété. L'ID d'objet peut être l'ID de table et la propriété peut être IsSystemTable , qui détermine si l'objet est ou non une table système.

Par conséquent, vous pourriez faire quelque chose comme ceci :

USE Music;
SELECT COUNT(*) AS [Number of System Tables]
FROM sys.objects 
WHERE OBJECTPROPERTY(object_id, 'IsSystemTable') = 1;

Résultat :

+---------------------------+
| Number of System Tables   |
|---------------------------|
| 72                        |
+---------------------------+

Liste des tableaux

Vous pouvez modifier les trois options si vous souhaitez répertorier les tables au lieu de simplement les compter. Pour cela, il suffit de remplacer le COUNT(*) AS [Number of User Tables] avec * . Vous pouvez également nommer explicitement les colonnes que vous souhaitez renvoyer.

Compter les tables définies par l'utilisateur

Si vous avez besoin de connaître le numéro d'utilisateur tables, consultez 5 façons de compter le nombre de tables définies par l'utilisateur dans SQL Server.