2012-04-10 9 views
1

Мне нужно заполнить списки кодов после публикации моей базы данных с помощью SSDT. Поэтому я добавил в проект новый сценарий после развертывания, и из него я вызываю другие скрипты с помощью команды SQLCMD: r, каждая из которых вставляет данные в одну таблицу. Но если таблица уже заполнена, нарушаются ограничения первичного ключа и нарушена целая установка.Игнорировать ошибки в сценарии SSDT Post-Deployment

Как я могу подавить ошибки в сценарии после развертывания? Команда SQLCMD :on error ignore не поддерживается.

ответ

0

Почему вы не изменяете свой скрипт, чтобы избежать повторного вставки существующих значений? Использование общего табличного выражения, вы бы что-то похожее:

;with cte as (select *, row_number() over (partition by ... order by ...) as Row from ...) 
    insert into ... 
    select ... 
    from cte where not exists (...) and cte.Row = 1 

не может быть более явным, не ваше определение таблицы ...

+0

Да, это одно из возможных решений. Но я ищу что-то более общее, что можно использовать только в главном сценарии после развертывания. –

+0

Я думаю, что это самое чистое решение. Удаление ограничения первичного ключа (с помощью ограничения alter table ... drop) без предварительной очистки таблицы (или удаление/повторное создание) может создать дубликаты (и приведет к ошибкам, когда вы попытаетесь восстановить ограничение через alter table ... добавить ограничение ... primary key (...)) –

+0

Даже ответ не отвечает на мой вопрос. Это может помочь в подобных ситуациях. Поэтому я принимаю это. –

2

Вот хороший пример того, как добиться того, что вы ищете с помощью оператор MERGE вместо необработанных INSERT.

http://blogs.msdn.com/b/ssdt/archive/2012/02/02/including-data-in-an-sql-server-database-project.aspx

+1

Однако будьте осторожны с этим методом, поскольку метод значений табличных значений поддерживает только до 1K записей, таким образом, вставляемая комбинация #temptable в #table, а затем объединяет стратегию типа слияния (с источником из #temptable). Просто голова; Я столкнулся с этим ограничением. – SnapJag