2009-08-07 10 views
3

Je souhaite rechercher la valeur par défaut d'une colonne dans ma base de données SQL2005. Je n'ai que la chaîne de connexion du serveur SQL, donc je ne peux utiliser que l'espace de noms de la bibliothèque Sql (je ne peux pas utiliser le truc Oledb GetSchema). Je sais qu'il existe un GetSchema() ... mais comment l'utiliser pour obtenir un schéma de colonne, et donc la valeur par défaut? Je ne peux pas remplirSchema sur une base de données, car cela ne semble pas remplir la propriété valeur par défaut. Je peux utiliser "exec sp_columns 'ADDRESS_MASTER'" et cela retourne les valeurs par défaut, mais elles ne sont pas dans un format propre ... par exemple, une de mes valeurs par défaut de la colonne de texte est "(N'test)".Meilleur moyen de rechercher la valeur par défaut d'une colonne dans Sql Server

Je veux aussi obtenir la taille de la colonne ... sp_columns semble me donner tout ... mais je ne sais pas comment décoder les valeurs par défaut dans tous les cas?

+0

+1 Bonne question. Je suis perplexe. –

Répondre

2

Votre problème ici est la valeur par défaut est une expression et il semble que vous voulez revenir juste une valeur telle que « bob » ou 5.

Cette tombe à peu près sur le moment où vous avez GetDate() ou appelez une fonction personnalisée telle que dbo.MyFunc(). À ce stade, que devrait-il renvoyer comme valeur par défaut?

En tant que tel la seule chose fiable le serveur SQL peut faire est de retour pour vous l'expression qu'il utilisera pour générer la valeur par défaut, vous pouvez exécuter ce à travers le nouveau serveur SQL pour déterminer le résultat, à savoir:

DECLARE @def nvarchar(max) 

SELECT @def = column_def FROM information_schema.columns 
WHERE table_name = 'ADDRESS' AND column_name = 'ADDRESS_MASTER' 

EXEC ('SELECT ' + @def) 

Bien sûr, si l'expression n'est pas constante, comme dans le cas de GetDate, cela sera incorrect au moment où vous venez d'insérer des données réelles. Aussi, cela causerait des problèmes si vous utilisiez une fonction personnalisée avec des effets secondaires, mais une fonction personnalisée avec des effets secondaires utilisés par défaut, je considérerais déjà un problème.

+0

Merci KeeperOfTheSoul ... oui, je l'ai rencontré l'autre jour ... le client a mis "GetDate()" dedans, et j'ai réalisé que mes hypothèses étaient fausses. J'ai donc abandonné l'idée et j'ai décidé de mettre les valeurs par défaut dans un fichier séparé pour l'application. le seul problème que j'ai maintenant est de choisir quelle réponse accepter entre vous et Ben !! –

0

Jetez un oeil à la sortie de

select * from INFORMATION_SCHEMA.Columns 

Est-ce que l'aide?

+1

non, c'est la même chose que le sp_columns ... il retourne toujours COLUMN_DEFAULT de "(N'test ')" ... c'est ce que je demandais à propos de ... –

0

Vous pouvez utiliser SMO (SQL Server Management Objects) pour récupérer ces informations. Vous aurez besoin d'ajouter des références à certaines des Microsoft.SqlServer.* assemblées (pas sûr de ceux - il est assez déroutant), et vous devriez être en mesure de faire quelque chose comme ceci:

Server myServer = new Server("servername"); 
Database myDatabase = myServer.Databases["myDatabaseName"]; 
Table myTable = myDatabase.Tables["myTableName"]; 
Column myColumn = myTable.Columns["myColumnName"]; 

string defaultValue = myColumn.Default; 

Marc

2

Bonne question . Si le type de données est connu à l'avance, vous pouvez utiliser certaines opérations de remplacement de chaîne évidentes pour obtenir la valeur formatée. Par exemple, si 1 est la valeur par défaut d'une colonne int, elle est renvoyée dans le résultat sp_columns column_def sous la forme ((1)). J'ai travaillé sur ce problème pendant un moment ce soir et je n'ai pas de meilleur conseil.

Je ne suis pas sûr que ce serait utile à quelqu'un d'autre qui veut prendre une fissure à cela, mais voici les sp_columns appellent ainsi que les résultats capturés:

Declare @TableName varchar(255); 
Set @TableName = 'Table'; 

Declare @ColumnName varchar(255); 
Set @ColumnName = 'Column'; 

Declare @ColumnDefinition Table 
(
    TABLE_QUALIFIER sysname null, 
    TABLE_OWNER  sysname null, 
    TABLE_NAME  sysname null, 
    COLUMN_NAME  sysname null, 
    DATA_TYPE  sysname null, 
    TYPE_NAME  sysname null, 
    PRECISION  int null, 
    LENGTH   int null, 
    SCALE   int null, 
    RADIX   int null, 
    NULLABLE   bit null, 
    REMARKS   nvarchar(4000) Null, 
    COLUMN_DEF  sysname null, 
    SQL_DATA_TYPE int null, 
    SQL_DATETIME_SUB int null, 
    CHAR_OCTET_LENGTH int null, 
    ORDINAL_POSITION int null, 
    IS_NULLABLE  char(3) null, 
    SS_DATA_TYPE  int null 
) 

Insert Into @ColumnDefinition 
Exec sp_columns @TableName, @column_name = @ColumnName 

Select COLUMN_DEF From @ColumnDefinition 
+0

ouais, voyez-vous ... le format de valeur par défaut n'est pas connu dans tous les cas ... donc je suppose que je devrais construire un tas de logique pour dire "si nvarchar puis regex (.. .) else si int puis regex (...) "et que juste sux! –

0

Pour obtenir la valeur de contrainte par défaut une colonne particulière, faites ceci:

SELECT defaults.definition 
FROM sys.all_columns AS cols 
INNER JOIN sys.default_constraints AS defaults ON cols.default_object_id = defaults.object_id 
WHERE cols.object_id = @TABLEID AND cols.[name] = @COLNAME 

où @TABLEID est juste l'ID de la table et @COLNAME le nom de la colonne que vous voulez dans la base de données.

Questions connexes