Вопрос по tsql, sql-server, database, sql – Удалить ограничение по умолчанию для столбца в TSQL

33

У меня есть таблица с таким столбцом, который в настоящее время живой:

name NVARCHAR(128) NOT NULL DEFAULT ''

Я изменяю столбец следующим образом:

ALTER TABLE  mytable ALTER COLUMN name NVARCHAR(128) NULL

Тем не менее, ограничение по умолчанию, названное «DF__mytable__datab__7DE4B36» в одном случае таблицы все еще остается. Я знаю, что этого можно было бы избежать, если бы первоначальный автор назвал ограничение. У меня есть несколько экземпляров этих таблиц, но я не хочу вручную удалять все ограничения в каждой моей таблице. Какой самый простой и элегантный способ удалить это ограничение по умолчанию для столбца в Sql Server, который я могу единообразно применить к каждому экземпляру этой таблицы?

EDIT

Это сценарий, который я в конечном итоге использовал:

DECLARE @table_id AS INT
DECLARE @name_column_id AS INT
DECLARE @sql nvarchar(255) 

-- Find table id
SET @table_id = OBJECT_ID('mytable')

-- Find name column id
SELECT @name_column_id = column_id
FROM sys.columns
WHERE object_id = @table_id
AND name = 'name'

-- Remove default constraint from name column
SELECT @sql = 'ALTER TABLE mytable DROP CONSTRAINT ' + D.name
FROM sys.default_constraints AS D
WHERE D.parent_object_id = @table_id
AND D.parent_column_id = @name_column_id
EXECUTE sp_executesql @sql

Другой сценарий, который можно использовать для достижения этой цели, можно найти здесь: Как отбросить ограничение SQL по умолчанию, не зная его имени?

Спасибо!

Да, похоже, что этот ответ тоже сработает, но я сам не проверял этот сценарий. Mohammed Ali
Что не так с использованием большей части второго ответа здесь?stackoverflow.com/questions/314998/… ta.speot.is
Возможный дубликатSQL Server 2005 drop column with constraints T.J. Crowder
возможный дубликатHow do you drop a default value or similar constraint in T-SQL? Ruben Bartelink
Поскольку вы конкретно ссылаетесь наdefault ограничения и принятый в настоящее время ответ не работают для них, я предлагаю пометить один из ответов, который фактически работает вместо правильного (если это означает, что вам нужно опубликовать ответ с кодом из своего вопроса, чтобы вы могли его принять, это нормально). Это тратит впустую время людей, если ответ "принять" на самом деле не работает. T.J. Crowder

Ваш Ответ

3   ответа
2

DECLARE @sqlStatement nvarchar(MAX),
        @tableName nvarchar(50) = 'TripEvent',
        @columnName nvarchar(50) = 'CreatedDate';

SELECT                  @sqlStatement = 'ALTER TABLE ' + @tableName + ' DROP CONSTRAINT ' + dc.name + ';'
        FROM            sys.default_constraints AS dc
            LEFT JOIN   sys.columns AS sc
                ON      (dc.parent_column_id = sc.column_id)
        WHERE           dc.parent_object_id = OBJECT_ID(@tableName)
        AND         type_desc = 'DEFAULT_CONSTRAINT'
        AND         sc.name = @columnName
PRINT'   ['[email protected]+']:'+@@SERVERNAME+'.'+DB_NAME()+'@'+CONVERT(VarChar, GETDATE(), 127)+';  '[email protected];
IF(LEN(@sqlStatement)>0)EXEC sp_executesql @sqlStatement
54

ALTER TABLE <schema_name, sysname, dbo>.<table_name, sysname, table_name>
   DROP CONSTRAINT <default_constraint_name, sysname, default_constraint_name>
GO

Со скриптом

-- t-sql scriptlet to drop all constraints on a table
DECLARE @database nvarchar(50)
DECLARE @table nvarchar(50)

set @database = 'dotnetnuke'
set @table = 'tabs'

DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
    select    @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @table
    exec    sp_executesql @sql
END

Кредиты идут к Джону Галлоуэю http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx

Хорошо, удачи и дайте нам знать, если вам нужна дополнительная помощь
Я добавил скрипт, который удаляет ограничение для таблицы базы данных
Я еще не пробовал, но будет работать так же, если я хочу убрать все ограничения по умолчанию для столбца вместо таблицы. Я постараюсь изменить сценарий сегодня вечером, чтобы увидеть, смогу ли я. Mohammed Ali
К сожалению, & quot; INFORMATION_SCHEMA.TABLE_CONSTRAINTS & quot; не имеет метаданных для ограничений по умолчанию. Mohammed Ali
Немного изменил мой вопрос. Я на самом деле ищу способ сделать это, не зная имени ограничения для каждой таблицы, которую я имею Mohammed Ali
1

потому что я столкнулся с той же проблемой и решил этимрешение. First of all a constraint is always built with a Hash значение в его имени. Так что проблема в этомHASH Это зависит от другой машины или базы данных. НапримерDF__Companies__IsGlo__6AB17FE4 Вот6AB17FE4 это значение хеша (8 бит). Поэтому я имею в виду один сценарий, который будет полезен для всех

DECLARE @Command NVARCHAR(MAX)
     declare @table_name nvarchar(256)
     declare @col_name nvarchar(256)
     set @table_name = N'ProcedureAlerts'
     set @col_name = N'EmailSent'

     select @Command ='Alter Table dbo.ProcedureAlerts Drop Constraint [' + ( select d.name
     from 
         sys.tables t
         join sys.default_constraints d on d.parent_object_id = t.object_id
         join sys.columns c on c.object_id = t.object_id
                               and c.column_id = d.parent_column_id
     where 
         t.name = @table_name
         and c.name = @col_name) + ']'

    --print @Command
    exec sp_executesql @Command

Это снимет ограничения по умолчанию. Однако, если вы хотите создать его снова, вы можете просто попробовать это

ALTER TABLE [dbo].[ProcedureAlerts] ADD DEFAULT((0)) FOR [EmailSent]

Наконец, просто запуститеDROP Команда сбросить столбец.

Почему бы не добавить это так:ALTER TABLE [dbo].[ProcedureAlerts] ADD CONSTRAINT [DF_ProcedureAlerts_EmailSent] DEFAULT ((0)) FOR [EmailSent]   Таким образом, он будет назван и его будет легче удалить в следующий раз.

Похожие вопросы