La meilleure façon de searchr la valeur par défaut d'une colonne dans Sql Server

Je veux searchr la valeur par défaut d'une colonne dans ma database SQL2005. Je n'ai que la string de connection du server 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 get un schéma de colonne, et donc la valeur par défaut? Je ne peux pas remplirSchema sur une database, car cela ne semble pas remplir la propriété valeur par défaut. Je peux utiliser "exec sp_columns 'ADDRESS_MASTER'" et cela returnne 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 text est "(N'test)".

Je veux aussi get 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?

Votre problème ici est la valeur par défaut est une expression et il semble que vous voulez juste renvoyer une valeur comme 'bob' ou 5.

Cela tombe à peu près au 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 que le server sql peut faire est de vous renvoyer l'expression qu'il utilisera pour générer la valeur par défaut, vous pouvez l'exécuter à nouveau via le server 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'insert 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.

Bonne question. Si le type de données est connu à l'avance, vous pouvez utiliser certaines opérations de rlocation de string évidentes pour get 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 si cela serait utile à quelqu'un d'autre qui veut faire une fente, mais voici l'appel sp_columns avec 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 

Jetez un oeil à la sortie de

 select * from INFORMATION_SCHEMA.Columns 

Est ce que ça aide?

Vous pouvez utiliser SMO (SQL Server Management Objects) pour récupérer ces informations. Vous devrez append des references à certains des assemblages Microsoft.SqlServer.* (Vous ne savez pas lesquels – c'est plutôt déroutant), et vous devriez être capable de faire quelque chose comme ça:

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

Marc

Pour get la valeur de contrainte par défaut pour une colonne particulière, procédez comme suit:

 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 database.