web-dev-qa-db-fra.com

SQL Server: SELECT à partir de sys.tables et sys.views

Le SQL ci-dessous semble fonctionner, mais je me demande s’il existe un meilleur moyen d’écrire cela. J'essaie de sélectionner toutes les vues et tous les tableaux portant un nom spécifique. Il ne devrait y avoir qu'une seule valeur de retour si une correspondance est trouvée.

SELECT DISTINCT name 
FROM sys.tables 
WHERE name = 'MyName'  

UNION ALL

SELECT DISTINCT name 
FROM sys.views 
WHERE name = 'MyName'
4
Chris Lombardi

INFORMATION_SCHEMA est exposé dans SQL Server. Veuillez noter que prendre TABLE_NAME ici ne tient pas compte du schéma de la table.

Plus de DMV ici

Alors, consultez d'abord ces vues de gestion dynamique (DMV) séparément. 

SELECT * FROM INFORMATION_SCHEMA.TABLES

SELECT * FROM INFORMATION_SCHEMA.VIEWS

Vous pouvez utiliser 

SELECT 
    distinct TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'MyName'  

UNION ALL

SELECT 
    distinct TABLE_NAME 
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_NAME= 'MyName'
3
Amit

Une autre vue peut vous aider: il s'agit d'une vue unique contenant à la fois des tables et des vues. En termes de performances, ma requête à une seule table est plus performante, même si vous ne le remarquerez que dans une base de données contenant un très grand nombre de tables. J'ai modifié votre requête à cette fin.

SELECT 
    DISTINCT NAME 
FROM SYS.OBJECTS
WHERE TYPE IN ('U','V')
AND NAME= 'MYNAME'

U = Table d'utilisateurs
V = Voir

1
Eli

Si vous aviez une table et une vue avec le même nom mais avec des schémas différents, vous récupéreriez un jeu de résultats avec deux lignes - cela ne répond pas à vos exigences. Au lieu de cela, utilisez simplement 'Union' et supprimez les requêtes distinctes des requêtes individuelles.

SELECT 
    name 
FROM sys.tables 
WHERE name = 'MyName'  

UNION 

SELECT 
    name 
FROM sys.views 
WHERE name= 'MyName'
0
Ryan B.

Plutôt que de faire un DISTINCT, je préfère voir tout ce qui répond aux critères de filtrage. L'ajout de quelques colonnes supplémentaires vous permettra d'identifier réellement les données renvoyées.

SELECT 
    o.object_id,
    ObjectName = CONCAT(s.name, ',', o.name),
    ObjectType = o.type_desc
FROM
    sys.objects o
    JOIN sys.schemas s
        ON o.schema_id = s.schema_id
WHERE 
    o.type IN ('U', 'V')
    AND o.name = 'MyName';
0
Jason A. Long