#sql-server #sql-server-2005 #sql-server-2008
#sql-сервер #sql-server-2005 #sql-server-2008
Вопрос:
Я пишу скрипт, который анализирует таблицы базы данных, и у меня возникают проблемы с получением значений столбцов по умолчанию из 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:
Вы пробовали 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'
Комментарии:
1. Спасибо, я пытался, но с теми же результатами. Это означает, что происходит что-то странное, потому что это не работало на SQL Server 2008, но команда выполнялась на SQL Server 2005… только с результатами, т. Е. Нет.