Подтвердить что ты не робот

Ограничить ограничение по умолчанию для столбца в TSQL

У меня есть таблица со столбцом, подобным этому, в настоящее время:

name NVARCHAR(128) NOT NULL DEFAULT ''

Я изменяю столбец, подобный этому, чтобы сделать его нулевым:

ALTER TABLE  mytable ALTER COLUMN name NVARCHAR(128) NULL

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

ИЗМЕНИТЬ

Это script, который я использовал, используя

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

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

Спасибо, Mohammed

4b9b3361

Ответ 1

Вот как вы можете отказаться от ограничения

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

С помощью script

-- 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

Кредиты отправляются в Jon Galloway http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx

Ответ 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]+']:'[email protected]@SERVERNAME+'.'+DB_NAME()+'@'+CONVERT(VarChar, GETDATE(), 127)+';  '[email protected];
IF(LEN(@sqlStatement)>0)EXEC sp_executesql @sqlStatement

Ответ 3

Я хотел бы упомянуть предыдущий вопрос, потому что я столкнулся с той же проблемой и решил этот решение. Прежде всего ограничение всегда строится с именем Hash в нем. Таким образом, проблема заключается в том, что Hash варьируется в разных машинах или в базе данных. Например DF__Companies__IsGlo__6AB17FE4 здесь 6AB17FE4 - это значение хеша (8 бит). Поэтому я имею в виду единственный script, который будет плодотворным для всех

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, чтобы удалить столбец.