2015-10-01 1 views
0

Je suis un peu nouveau pour SQL et je suis venu avec un problème que je ne pouvais pas résoudre même si j'ai pensé à ce sujet pendant deux ou trois heures. Le problème que je suis sur le point de présenter des états que j'ai quelques tables et des procédures stockées dans une base de données aléatoire sur un serveur SQL. Ces tables et années SP sont nommés avec les formats suivants:Obtenir le nom du schéma et le nom de la table à la fois

[schema name].[table name]

et

[schema name].[sp name] 

Ma tâche est de capturer ces deux valeurs, que ce soit pour un nom de table ou pour un SP. J'ai exécuté l'instruction (qui contient 4 requêtes SQL) ci-dessous sur C# puis en lisant les valeurs sortantes via le SqlDataReader, j'ai pensé que j'avais apparié les noms de schéma avec les noms de table/SP à côté d'eux. La plupart d'entre eux l'ont fait de toute façon, mais je dois tous les faire correspondre correctement.

if (requestCode == 1) 
{ 
    SetSpecificList("USE " + db_name + "; SELECT * FROM sys.tables", "USE " + db_name + "; SELECT * FROM INFORMATION_SCHEMA.TABLES", tablesList, requestCode); 
} 
else if (requestCode == 2) 
{ 
    SetSpecificList("USE " + db_name + "; SELECT * FROM sys.procedures", "USE " + db_name + "; SELECT * FROM INFORMATION_SCHEMA.ROUTINES", SPList, requestCode); 
} 

J'apprécierais un avis sur la combinaison de deux instructions SQL (simplement une déclaration) pour obtenir le nom complet d'une table/SP, au lieu de le diviser comme [schema name][table name], en deux requêtes.

Répondre

0

je serais toujours enclin à utiliser les vues du catalogue système sur la INFORMATION_SCHEMA pour les raisons exposées in this article, et je ne suis pas 100% sûr pourquoi vous utilisez à la fois dans ce cas ...

Quoi qu'il en soit, vous pouvez utilisez la fonction OBJECT_SCHEMA_NAME(), par exemple

SELECT TableName = QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + '.' + QUOTENAME(t.name) 
FROM sys.tables AS t; 

Ou vous pouvez rejoindre à sys.schemas:

SELECT TableName = QUOTENAME(s.name) + '.' + QUOTENAME(t.name) 
FROM sys.tables AS t 
     INNER JOIN sys.schemas AS s 
      ON s.schema_id = t.schema_id; 

Pour ce que cela vaut bien, vous pouvez obtenir les procédures et les tables (et tous les autres objets) à partir de la même table:

SELECT ObjectName = QUOTENAME(s.name) + '.' + QUOTENAME(o.name), 
     ObjectType = o.type_desc 
FROM sys.all_objects AS o 
     INNER JOIN sys.schemas AS s 
      ON s.schema_id = o.schema_id 
WHERE o.[type] IN ('U', 'P'); 
+0

J'ai utilisé le deuxième extrait de code que vous avez fourni pour moi, et il fonctionne de la façon dont j'ai besoin. Je vous remercie! –