Это гораздо сложнее, чем кажется, я нашел способ, который работает для меня - я считаю, что он будет работать только на SQL Server 2005 или выше.Вот полный сценарий:
Таблица была создана с уникальным ограничением на столбец, например:
CREATE TABLE table_name (
id bigint identity not null,
column_name varchar(255) not null,
primary key(id),
unique (column_name)
);
Некоторое время спустя обнаруживается, что это уникальное ограничение нежелательно.
INSERT INTO table_name(column_name) VALUES('col1');
приводит к: Нарушению ограничения UNIQUE KEY 'UQ__table_na__9FA0BA59160F4887'.Невозможно вставить дубликат ключа в объект 'dbo.table_name'.
Если у вас есть ручное управление этой БД и вы можете запускать SQL непосредственно на нем, просто выполните:
ALTER TABLE table_name DROP CONSTRAINT UQ__table_na__9FA0BA59160F4887;
В моемВ этом случае эти сценарии будут выполняться в разных средах, а ключи не будут иметь одинаковых имен, поэтому для снятия ограничения мне понадобится SQL, который принимает имя таблицы и столбца в качестве входных данных и вычисляет остальное.
DECLARE @table_name nvarchar(256)
DECLARE @col_name nvarchar(256)
DECLARE @Command nvarchar(1000)
-- set your table and column name here:
SET @table_name = N'table_name'
SET @col_name = N'column_name'
SELECT @Command = 'ALTER TABLE ' + @table_name + ' DROP CONSTRAINT ' + d.name
FROM sys.tables t
JOIN sys.indexes d ON d.object_id = t.object_id AND d.type=2 and d.is_unique=1
JOIN sys.index_columns ic on d.index_id=ic.index_id and ic.object_id=t.object_id
JOIN sys.columns c on ic.column_id = c.column_id and c.object_id=t.object_id
WHERE t.name = @table_name and c.name=@col_name
--if you want to preview the generated command before running
SELECT @Command
EXEC sp_executesql @Command;
Это удаляет уникальное ограничение на столбец и позволяет продолжить вставку.