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'
INFORMATION_SCHEMA est exposé dans SQL Server. Veuillez noter que prendre TABLE_NAME ici ne tient pas compte du schéma de la table.
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'
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
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'
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';