2012-04-10 10 views
1

Ich muss Codelisten nach dem Veröffentlichen meiner Datenbank mit SSDT füllen. Daher habe ich dem Projekt ein neues Post-Deployment-Skript hinzugefügt und rufe von dort aus mithilfe des Befehls SQLCMD: r weitere Skripts auf, die jeweils Daten in eine Tabelle einfügen. Wenn die Tabelle jedoch bereits gefüllt ist, werden Primärschlüsseleinschränkungen verletzt und das gesamte Setup wird unterbrochen.Fehler ignorieren in SSDT Post-Deployment-Skript

Wie kann ich Fehler im Post-Deployment-Skript unterdrücken? Der SQLCMD-Befehl :on error ignore wird nicht unterstützt.

Antwort

0

Warum ändern Sie Ihr Skript nicht, um das Wiedereinführen vorhandener Werte zu vermeiden? Mit Hilfe eines allgemeinen Tabellenausdruck, würden Sie so etwas wie haben:

;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 

nicht deutlicher werden können, ohne Ihre Tabellendefinition mit ...

+0

Ja, es ist eine mögliche Lösung. Aber ich suche nach etwas allgemeinerem, was nur im Haupt-Post-Deployment-Skript verwendet werden kann. –

+0

Ich denke, es ist die sauberste Lösung. Das Löschen der Primärschlüsseleinschränkung (über alter table ... drop constraint), ohne zuerst die Tabelle zu bereinigen (oder zu löschen/neu zu erstellen), erzeugt möglicherweise Duplikate (und wird zu Fehlern führen, wenn Sie versuchen, die Einschränkung wiederherzustellen via alter table ... add constraint ... Primärschlüssel (...)) –

+0

Auch die Antwort beantwortet meine Frage nicht. Es kann in ähnlichen Situationen helfen. Also akzeptiere ich es. –

2

Hier ist ein gutes Beispiel dafür, wie man das erreichen, was Sie suchen mit die MERGE-Anweisung anstelle von Raw-INSERTs.

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

+1

Seien Sie jedoch vorsichtig mit dieser Methode, da die Methode Table Values ​​Function nur bis zu 1K Datensätze unterstützt, also eine #TempTable-Kombination in #table, dann Merge (with source from #temptable) type-Strategie einfügen. Nur ein Kopf hoch; Ich bin auf diese Einschränkung gestoßen. – SnapJag