2009-04-21 2 views
4

У меня такая же проблема, как описано в this question, но это SQL Server 2005 и «принято» ответ не работает в SQL Server 2000.SQL Server 2000 столбец падение с ограничениями

В частности: Я пытаясь запустить ALTER TABLE foo DROP COLUMN bar, и он не работает, потому что есть «ограничение по умолчанию». Смысл, у меня есть значение по умолчанию для этого столбца, который SQL Server реализует как отдельное ограничение, которое мне нужно удалить первым.

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

Ответ, данный в этом другом вопросе, работает для меня в SQL Server 2005, но не в SQL Server 2000. Мне нужен последний.

[UPDATE] Мне нужен запрос, который может ответить на вопрос «Что такое имя ограничения по умолчанию для столбца bar в таблице foo.» Не способ для человека найти ответ вручную.

+0

Почему вы делаете это с трудом? Вы уже знаете, что это устарело, когда они обновляют свой сервер. – dkretz

+0

Что значит «это устарело?» Это серверы, работающие на сайтах клиентов. –

ответ

3

Только что выяснил, что на самом деле делал запрос SQL 2005. Вот тиражирование этого запроса, который работает в SQL 2000

select 
    col.name, 
    col.colorder, 
    col.cdefault, 
    OBJECTPROPERTY(col.cdefault, N'IsDefaultCnst') as is_defcnst, 
    dobj.name as def_name 
from syscolumns col 
    left outer join sysobjects dobj 
     on dobj.id = col.cdefault and dobj.type = 'D' 
where col.id = object_id(N'dbo.table_name') 
and dobj.name is not null 
+0

Выглядит хорошо. Это похоже на работу в SQL Server 2005 - не так ли? Вы используете col.cdefault вместо col.default_object_id - являются ли они ОБА в 2005 году? –

+0

SQL Server 2005 имеет представления совместимости, которые имитируют системные таблицы в SQL Server 2000. Таким образом, хотя сценарий 2005 использует sys.objects, SQL 2000 использует sysobjects (без точки), который также доступен в виде совместимости в SQL Server 2005 . Имеет ли это смысл? – bdukes

+0

Делает смысл, спасибо. Тонкий! –

0
sp_help 'tablename' 

дает кучу информации на столе - включая все ограничения и имена ограничений

Собственно sp_help вызовов это:

sp_helpconstraint 'tablename', nomsg 

По умолчанию ограничения будут говорить «DEFAULT на колонке ххх "

+0

Я запустил это и достал кучу объектов ResultSet. Как определить, какое ограничение для значений по умолчанию? Я могу видеть как человека, но что такое правильный * запрос * Я могу делать программно? –

+0

OK ... можно ли уменьшить это до одного запроса, который вернет одну строку с ответом (если имеется ограничение по умолчанию) или нет строк, если нет ответа? Или, по крайней мере, один результирующий набор, где легко найти ответ с именем столбца? –

1

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

select * from sysobjects [constraint] 
join sysobjects [table] on [constraint].parent_obj = [table].id 
where [constraint].type = 'D' 
and [table].name = 'table_name' 
--another option: and [table].id = OBJECT_ID(N'dbo.table_name') 
+0

Это выглядит близко (+1), но я не вижу имени столбца в этих строках. Как определить, какая строка идет с этим столбцом? –

0

Это один построен над первым решением, предоставленного bdukes, смешанной с INFORMATION_SCHEMA.COLUMNS, кажется, что информация содержит порядковый номер столбца принадлежит по умолчанию

SELECT name 
FROM sysobjects [constraint] 
JOIN sysobjects [table] on [constraint].parent_obj = [table].id 
JOIN information_schema.columns col ON [table].name = col.table_name AND [constraint].info = col.ordinal_position 
WHERE [constraint].type = 'D' 
AND [table].name = 'table_name' 
AND col.column_name = 'column_name' 
Смежные вопросы