2008-10-31 3 views
4

J'ai besoin d'une manière intelligente 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 est les champs «supplémentaires» qui doivent être compris, tels que NUMERIC _ PRECISION et NUMERIC _ SCALE.Comment puis-je obtenir une définition de colonne SQL Server avec des parenthèses et tout?

Évidemment, je peux ignorer les colonnes pour INTEGER (précision de 10 et échelle de 0), mais il y a d'autres types qui m'intéressent, tels que NUMERIC. Donc, sans écrire beaucoup de code pour analyser la table, des idées sur la façon d'obtenir une sorte de raccourci de champ hors de la définition de la colonne?

Je voudrais être en mesure d'obtenir quelque chose comme: int, datetime, argent, ** numérique (10,2) **

Répondre

4

Voici une mise à jour (ripoff!) de GalacticCowboy's answer pour résoudre certains problèmes et mise à jour pour tous (je pense) SQL Server 2008R2: types de données

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 
+1

Tous les nouveaux types de données ne concernent pas tous les nouveaux types de date/heure. 'time',' datetime2' et 'datetimeoffset' peuvent tous prendre une précision en fractions de secondes, trouvée dans la colonne DATETIME_PRECISION. – MattW

+1

@MattW bonne capture, j'ai mis à jour le script pour inclure datetime_precision sur ceux-ci aussi bien. Peut-être que je vais travailler sur l'ajout de tous les types dans SQL Server 2016, aussi. –

1

SMO script doit prendre soin des générations de script. Je crois que c'est ce que MS utilise dans SQL Management Studio pour les générations de script.

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

@YourComment - I need a smart way to get the data types out of INFORMATION_SCHEMA.COLUMNS in a way that could be used in a CREATE TABLE statement

C'est ce que vous avez demandé. Bref, vous devrez analyser les résultats de la vue du schéma d'info.

+0

Je ne veux pas vraiment un script pour toute la table. J'essaie d'obtenir des types de données résolvables en inclure dans XQuery généré –

7
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 
+0

Ne gère pas varbinary (max) ... eh bien. – GalacticCowboy

+0

J'ai ajouté une [version mise à jour] (http://stackoverflow.com/a/11234044/880904) de cette réponse. –

1

Si vous utilisez SMO vous pouvez obtenir à la fois précision et une échelle en accédant aux propriétés colletion du Column Object

Column.Property [ "NumericScale"]. Valeur

Column.Property [ . "NumericPrecision"] Valeur

+1

Merci pour la réponse. Pour info, la syntaxe utilise "Properties" plutôt que "Property". Par exemple: Column.Properties ["NumericScale"]. Value – Tarzan

Questions connexes