Лучший способ поиска значения по умолчанию для столбца в Sql Server - PullRequest
3 голосов
/ 07 августа 2009

Я хочу посмотреть значение по умолчанию для столбца в моей базе данных SQL2005. У меня есть только строка подключения к SQL-серверу, поэтому я могу использовать только пространство имен библиотеки Sql (не могу использовать материал Oledb GetSchema). Я знаю, что есть GetSchema () ... но как мне использовать его, чтобы получить схему столбца и, следовательно, значение по умолчанию? Я не могу заполнить таблицу данных, потому что она не заполняет свойство значения по умолчанию. Я могу использовать "exec sp_columns 'ADDRESS_MASTER'", и это возвращает значения по умолчанию, но они не в чистом формате ... например, один из моих текстовых столбцов по умолчанию возвращается как "(N'test)".

Я также хочу получить размер столбца ... мне кажется, что sp_columns дает мне все ... но я не знаю, как декодировать значения по умолчанию во всех случаях?

Ответы [ 5 ]

2 голосов
/ 21 августа 2009

Ваша проблема здесь в том, что значение по умолчанию является выражением, и кажется, что вы хотите, чтобы оно просто возвращало значение, такое как 'bob' или 5.

В значительной степени это происходит в тот момент, когда вы используете GetDate () или вызываете пользовательскую функцию, такую ​​как dbo.MyFunc (). На данный момент, что он должен вернуть в качестве значения по умолчанию?

Поскольку единственная надежная вещь, которую может сделать сервер sql, - это вернуть вам выражение, которое он будет использовать для генерации значения по умолчанию, вы можете снова запустить его через сервер sql, чтобы определить результат, т.е.

DECLARE @def nvarchar(max)

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

EXEC ('SELECT ' + @def)

Конечно, если выражение не является константой, как, например, в случае GetDate, это будет неверно к тому времени, когда вы начнете вставлять фактические данные. Также это может вызвать проблемы, если использовать пользовательскую функцию с побочными эффектами, но пользовательскую функцию с побочными эффектами, используемую по умолчанию, я бы уже рассмотрел как проблему.

2 голосов
/ 07 августа 2009

Хороший вопрос. Если тип данных известен заранее, вы можете использовать некоторые очевидные операции замены строк, чтобы получить отформатированное значение. Например, если 1 является значением по умолчанию для столбца типа int, оно возвращается в результате sp_columns column_def как ((1)). Этим вечером я какое-то время работал над этой проблемой, и у меня нет лучшего совета.

Я не уверен, будет ли это полезно кому-то еще, кто захочет разобраться с этим, но вот вызов sp_columns вместе с полученными результатами:

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 голосов
/ 11 августа 2009

Чтобы получить значение ограничения по умолчанию для определенного столбца, выполните следующие действия:

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

где @TABLEID - это просто идентификатор таблицы, а @COLNAME - имя столбца в базе данных, который вы хотите.

0 голосов
/ 07 августа 2009

Вы можете использовать SMO (объекты управления SQL Server) для получения этой информации. Вам нужно будет добавить ссылки на некоторые из Microsoft.SqlServer.* сборок (не знаю, какие из них - это довольно странно), и тогда вы сможете сделать что-то вроде этого:

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

string defaultValue = myColumn.Default;

Марк

0 голосов
/ 07 августа 2009

Посмотрите на вывод

select * from INFORMATION_SCHEMA.Columns

Помогает ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...