SQL Server 2000 удалить столбец с ограничениями - PullRequest
4 голосов
/ 22 апреля 2009

У меня та же проблема, что описана в этом вопросе , но там есть SQL Server 2005 и «принятый» ответ не работает в SQL Server 2000.

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 22 апреля 2009

Просто выяснил, что на самом деле делал ссылочный запрос 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
1 голос
/ 22 апреля 2009

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

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 голосов
/ 22 апреля 2009

Это построено поверх первого решения, предоставленного 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'
0 голосов
/ 22 апреля 2009
sp_help 'tablename'

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

На самом деле sp_help вызывает это:

sp_helpconstraint 'tablename', nomsg

В ограничениях по умолчанию будет указано "ПО УМОЛЧАНИЮ для столбца ххх"

...