2012-10-25 5 views
0

Je l'ai vu une requête comme ceci dans une procédure stockéeObtenez le nom de la table en utilisant le schéma

SELECT ORDINAL_POSITION 'column_id', column_name 'column_name', 
     column_name + ' : ' + data_type 'column_nametype', 
     data_type 'data_type', 
     CHARacter_maximum_length 'SIZE' 
    FROM information_schema.columns 
    WHERE table_name = @TableName 

mais je trouve que INFORMATION_SCHEMA.COLUMNS n'est pas un nom de table et il est un schéma, mais comment il récupère les données?? et comment puis-je connaître le nom de la table réelle? Quelle est l'utilisation d'un schéma ??

+0

est le (http://msdn.microsoft.com/en-us/library/ms186778.aspx) [Documentation] pas clair? – Pondlife

Répondre

0

Les vues INFORMATION_SCHEMA résident dans la base de données principale sur le serveur et constituent un type d'affichage spécial qui récupère les données de votre contexte de base de données. En d'autres termes, bien qu'ils soient dans la base de données master, ils récupèrent des informations pour la base de données que vous utilisez actuellement.

Comme toute autre vue, vous pouvez voir la source de ces vues. Dans l'exemple particulier donné, il utilise sys.columns, sys.objects et sys.types qui sont eux-mêmes des vues système.

Bien que les vues telles que sys.types soient une vue à laquelle le code source est disponible, certaines tables/vues système ne sont pas disponibles pour une référence directe. Par exemple, sys.sysscalartypes n'est pas disponible pour l'utilisateur et la fonction système sysconv ne l'est pas non plus.

L'utilisateur des vues INFORMATION_SCHEMA n'est pas limité à SQL Server bien que les implémentations semblent être spécifiques à la plate-forme. Par exemple, MySQL a ses propres structures INFORMATION_SCHEMA.

L'utilisation des anciennes tables système sysobjects (par opposition aux tables système sys.objects) est déconseillée car il n'y a aucune garantie que leur utilisation se poursuivra à l'avenir. Il faut dire que INFORMATION_SCHEMA bien que généralement utile n'expose pas toujours le niveau d'information qu'un DBA exigerait.

0

Essayez cette requête:

DECLARE @TableName NVARCHAR(MAX) 

    SET @TableName = 'tblTest' 

    SELECT 
      column_id 'column_id', columns.name 'column_name' 
      ,columns.name + ' : ' + types.name 'column_nametype' 
      ,types.name 'data_type' 
      ,columns.max_length 'SIZE' 
    FROM 
     sys.columns 
    INNER JOIN 
     sys.types 
    ON 
     types.system_type_id = columns.system_type_id 
    WHERE 
     objecT_id = OBJECT_ID(@TableName) 
    ORDER BY 
     Column_id 
Questions connexes