2010-12-07 22 views
4

Comment puis-je déterminer les métadonnées de colonne à partir d'une table synonym dans une base de données SQL Server 2005? J'ai un synonyme appelé «ProjectSyn» pour une table appelée «Projet», mais je ne peux trouver aucune métadonnée de colonne pour le synonyme.Comment obtenir les métadonnées de colonne à partir d'un synonyme de table

Ma proposition est de déterminer quelque part la 'table de base' du synonyme, puis de rechercher les métadonnées de colonne pour cette table. Est-ce une approche correcte, et sinon, que serait-ce?

+0

Qu'est-ce qu'un synonyme? – Aliostad

+0

@Aliostad - Un autre nom pour un objet de base de données. Utile pour renommer des objets sans casser le code existant (au moins en théorie - Parfois l'abstraction ne fonctionne pas comme dans cette question). Syntaxe: 'CREATE SYNONYM ProjectSyn FOR Project' –

+0

Merci. Je ne l'ai jamais utilisé. – Aliostad

Répondre

1

Quelque chose comme ça? (Édité)

select c.* 
from 
    sys.columns c 
    inner join sys.synonyms s on c.object_id = object_id(s.base_object_name) 
where 
    s.name = 'ProjectSyn' 
+0

Merci @Jonas, mais votre code a besoin d'un peu de travail. La fonction OBJECT_NAME donne un nom non qualifié, où nom_objet_based est entièrement qualifié. – ProfK

+2

Bien sûr, cela ne retournera rien si le synonyme est pour un objet dans une base de données différente sur le même serveur, ou même un objet sur un serveur lié. Notez également que si le synonyme a été créé avec des parenthèses comme dans [[ProjectSyn]], la colonne base_object_name devra également inclure ces synonymes. – ErikE

+0

@ErikE La réponse par apc fonctionne à travers les bases de données et même les serveurs liés sans avoir besoin de faire correspondre les crochets. – Arkaine55

1

Oui, je pense que l'obtention de l'objet de base, puis récupérer les colonnes, est votre seule option.

Pour obtenir le nom de l'objet de base pour un synonyme, juste interroger la vue sys.synonyms

3

C'est ma solution qui fonctionne avec des synonymes de différentes bases de données:

SELECT TOP 0 * INTO #TEMP1 FROM YourTable 
SELECT 
    [column_name] = c.name, 
    [data_type] = t.name, 
    [character_maximum_length] = c.max_length 
FROM tempdb.sys.columns c 
inner join tempdb.sys.types t on t.system_type_id = c.system_type_id 
WHERE [object_id] = object_id('tempdb..#TEMP1'); 
DROP TABLE #TEMP1 
+0

Qu'en est-il des métadonnées de colonne? Ce n'est pas inclus dans cette réponse. – Taersious

+0

tempdb.sys.columns c ou tempdb.sys.types t contiennent les champs de métadonnées dont vous aurez besoin, par exemple t.name fournira le nom du type. Essayez le script avec SELECT * pour voir les champs disponibles. – apc