SQL Server 2005: ВЫБЕРИТЕ значение по умолчанию столбцов - PullRequest
1 голос
/ 03 ноября 2011

Я пишу скрипт, который анализирует таблицы базы данных, и у меня возникают проблемы с получением значения столбцов по умолчанию из SQL Server 2005.

Следующее прекрасно работает на SQL Server 2008, но когда я запускаю то же самое на SQL Server 2005, в результате получается пустая строка, и я не могу понять, почему.

DECLARE @sDatabase VARCHAR(100);
DECLARE @sTable VARCHAR(100);
DECLARE @sColumn VARCHAR(100);

SET @sDatabase = 'SomeDatabase';
SET @sTable = 'tbl_something';
SET @sColumn = 'SomethingID';

SELECT
    syscolumns.name AS column_name,
    systypes.name column_type,
    syscolumns.length AS column_length,
    syscolumns.prec AS column_precision,
    syscolumns.scale AS column_scale,
    syscolumns.isnullable AS column_nullable,
    syscomments.text AS column_default_value -- Should be default value!
FROM
    sysobjects 
    INNER JOIN syscolumns ON sysobjects.id = syscolumns.id
    INNER JOIN systypes ON syscolumns.xtype = systypes.xtype
    LEFT OUTER JOIN syscomments ON syscomments.id = syscolumns.cdefault
WHERE sysobjects.xtype = 'U'
AND sysobjects.name = @sTable
AND systypes.name != 'sysname'
ORDER BY
    sysobjects.name,
    syscolumns.colid

Другая версия выглядит следующим образом, но это та же история; возвращает пустую строку в SQL Server 2005, но правильное значение в SQL Server 2008.

SELECT COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = @sDatabase
AND TABLE_NAME = @sTable
AND COLUMN_NAME = @sColumn

Используется для сравнения определенных изменений между базами данных. Первоначально я думал, что проблема была в том, что SQL Server 2005 возвращал значения по умолчанию, такие как «((0))», в то время как SQL Server 2008 возвращал «(0)» для того же значения по умолчанию целого числа 0. Это то, что SQL Server Management Studio отчеты соответственно. Но при дальнейшем исследовании выясняется, что значения по умолчанию в SQL Server 2005 просто не отображаются вообще, поэтому он всегда записывается как изменение, хотя на самом деле его нет.

Любая помощь высоко ценится.

Спасибо!

1 Ответ

4 голосов
/ 04 ноября 2011

Вы пробовали представление sys.default_constraints?

Этот фрагмент находит по умолчанию для таблицы TestTable столбец nr:

create table TestTable (nr float default 3.13)

select  definition
from    sys.default_constraints dc
join    sys.columns c
on      c.object_id = dc.parent_object_id
        and c.column_id = dc.parent_column_id
where   parent_object_id = object_id('TestTable')
        and c.name = 'nr'       
...