Erstellen PK für die #temp-Tabelle ist fehlgeschlagen, wenn das Skript ausgeführt wird, parallel
Ich habe den folgenden code in eine gespeicherte Prozedur.
....
select ... into #temp from ....
alter table #temp add constraint PK_mytemp13 primary key (....)
....
Und ich bekomme folgende Fehlermeldung von Zeit zu Zeit, wenn die gespeicherte Prozedur ausgeführt wird, parallel.
Es ist bereits ein Objekt mit dem Namen 'PK_perf322dsf" in der Datenbank.
Es konnte keine Einschränkung. Finden Sie in Vorherige Fehlern.
Ich denke, es kann vermieden werden, indem die folgenden Ansätze. Gibt es eine andere elegantere Lösung?
- Erstellen Sie eine temporäre Tabelle mit primary key-ersten. Dann die Zeilen einfügen.
create table #temp (... primary key (....))
- Erstellen PK dynamisch mit session-id dynamisch.
declare @s varchar(500) = 'alter table #temp add constraint PK_temp' + @@spid + ' primary key (....)
InformationsquelleAutor ca9163d9 | 2012-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
wenn 2. - Sie können sich einfach Folgendes tun - ALTER TABLE #temp ADD PRIMARY KEY(...)
wenn 1. Sie haben, um die Tabelle zu erstellen (regelmäßig oder Globale temporäre) mit Schlüssel vor der Verwendung in parallelen Operationen
InformationsquelleAutor Oleg Dok
Dies kann nur geschehen, wenn die gleiche client-Verbindung Instanziierung (das entspricht einer SPID oder die Verbindung in SQL Server) wird erneut für 2 verschiedene Anrufe. Zwei parallele Anrufe sollten andere Verbindung Instanziierungen und separate SPIDs
SPIDs sind vollkommen getrennt von einander mit lokalen (einzelne #temp-Tabellen)
Edit:
Ignorieren über
Habe ich noch nie benannte Einschränkungen auf temp-Tabellen vor. Ich Indizes verwenden, wie ich Sie brauche oder einfach nur add PRIMARY KEY, nachdem die Spalte. Constraint-Namen sind Datenbank-einzigartig in sys.Objekte
PK ist im Grunde eines nicht eindeutigen gruppierten index. So verwenden
CREATE UNIQUE CLUSTERED INDEX
stattdessen als index-Namen sind einzigartig pro Tabelle in sys.Indizes.Dieser schlägt fehl, wenn die Ausführung im 2 SSMS-Abfrage windows
Neugierig, die Fehler und die constraint-Namen entsprechen, im Gegensatz zu Ihrem Fehler
Dies funktioniert
benannte Einschränkungen noch mit einem eindeutigen Namen in
tempdb
wie Sie sind einzigartig insys.objects
. Genannten Indizes müssen nicht sein. Tatsächlich ist die OP soll wohl nur mit einem eindeutigen index oder einem unamed Einschränkung. (Edit: Sehe was du meinst, über die Fehlermeldung, obwohl...)Gerade verifiziert. Siehe update. Ich habe nie gedacht, über die Verwendung von benannten constraints auf temporären Tabellen. Immer auf persistente Tabellen, obwohl
InformationsquelleAutor gbn
Ich war versucht sich zu erinnern, wie Sie dies tun, aber Sie können erstellen Sie eine namenlose primary key auf eine temp-Tabelle und vermeiden Sie diese Fehler. Dies ist anders, als das eine Spalte-level-PK, denn es unterstützt mehr als 1 Spalte. Hier ist ein Beispiel:
Dies ermöglicht dem end-Ziel plus verhindert name Vervielfältigung. Die Abfrage wird angezeigt, dass SQL Server eine GUID in den Namen der PK für Sie in sys.der sysobjects-Tabelle:
name | xtype
--------------------------------
#test___..._000000000407 | U
PK__#test_____B88A05A770B3A6A6 | PK
Können Sie Ihren Kuchen haben und ihn auch Essen.
InformationsquelleAutor CDC
Ich weiß, das beantwortet wurde und akzeptiert, aber noch nicht sehen, den richtigen Punkt wurde rufen.
beim erstellen von Benannten Einschränkung, name der Einschränkung hat, um genau zu sein am Tisch Niveau. Sie stammen aus dem Bereich auf der Datenbank-Ebene. also entweder erstellen Sie nicht namens gebunden und können sql pick eigenem Namen oder, wenn Sie Namen geben stellen Sie sicher, es s einzigartig, DB. auch für die TEMP-DB.
InformationsquelleAutor Anup Shah