Comment obtenir la définition de colonne SQL Server avec des parenthèses et tout le reste?

StackOverflow https://stackoverflow.com/questions/253324

Question

J'ai besoin d'un moyen intelligent pour extraire les types de données de INFORMATION_SCHEMA.COLUMNS d'une manière qui pourrait être utilisée dans une instruction CREATE TABLE. Le problème réside dans les champs supplémentaires à comprendre, tels que NUMERIC _ PRECISION et NUMERIC _ SCALE.

Évidemment, je peux ignorer les colonnes pour INTEGER (précision de 10 et échelle de 0), mais il y a d'autres types de personnes qui pourraient m'intéresser, telles que NUMERIC. Donc, sans écrire beaucoup de code pour analyser la table, aucune idée sur la manière d’obtenir une sorte de raccourci de champ à partir de la définition de colonne?

J'aimerais pouvoir obtenir quelque chose comme: int, date / heure, argent, numérique ** (10,2) **

Était-ce utile?

La solution

Voici une mise à jour (arnaque!) de réponse de GalacticCowboy pour résoudre certains problèmes et mettre à jour pour tous (je pense) Types de données SQL Server 2008R2:

select data_type + 
    case
        when data_type like '%text' or data_type in ('image', 'sql_variant' ,'xml')
            then ''
        when data_type in ('float')
            then '(' + cast(coalesce(numeric_precision, 18) as varchar(11)) + ')'
        when data_type in ('datetime2', 'datetimeoffset', 'time')
            then '(' + cast(coalesce(datetime_precision, 7) as varchar(11)) + ')'
        when data_type in ('decimal', 'numeric')
            then '(' + cast(coalesce(numeric_precision, 18) as varchar(11)) + ',' + cast(coalesce(numeric_scale, 0) as varchar(11)) + ')'
        when (data_type like '%binary' or data_type like '%char') and character_maximum_length = -1
            then '(max)'
        when character_maximum_length is not null
            then '(' + cast(character_maximum_length as varchar(11)) + ')'
        else ''
    end as CONDENSED_TYPE
    , *
from information_schema.columns
order by table_schema, table_name, ordinal_position

Autres conseils

select column_type = data_type + 
    case
        when data_type like '%text' then ''
        when data_type like '%char' and character_maximum_length = -1 then '(max)'
        when character_maximum_length is not null then '(' + convert(varchar(10), character_maximum_length) + ')'
        when data_type = 'numeric' then '(' + convert(varchar(10), isnull(numeric_precision, 18)) + ', ' + 
            convert(varchar(10), isnull(numeric_scale, 0)) + ')'
        else ''
    end
,*
from information_schema.columns

Les scripts SMO doivent prendre en charge les générations de scripts. Je pense que c'est ce que MS utilise dans SQL Management Studio pour les générations de scripts.

http://msdn.microsoft.com/en-us/library /ms162153.aspx

@YourComment - J'ai besoin d'un moyen intelligent pour extraire les types de données de INFORMATION_SCHEMA.COLUMNS d'une manière qui pourrait être utilisée dans une instruction CREATE TABLE

C'est ce que vous avez demandé. En dehors de cela, vous devrez analyser les résultats de la vue de schéma d’informations.

Si vous utilisez smo, vous pouvez obtenir à la fois précision et échelle en accédant à la collection Propriétés du Objet de colonne

Column.Property ["NumericScale"]. Value

Column.Property ["NumericPrecision"]. Value

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top