Insert into ... Select *, wie Sie zu ignorieren Identität?
Habe ich eine temp-Tabelle mit der genauen Struktur einer konkreten Tabelle T
. Es wurde wie folgt erstellt:
select top 0 * into #tmp from T
Nach der Verarbeitung und Abfüllung in Inhalt in #tmp
, ich möchte, um den Inhalt zu kopieren zurück zu T
wie diese:
insert into T select * from #tmp
Dies ist okay, solange T
haben nicht die identity-Spalte, aber in meinem Fall funktioniert. Gibt es eine Möglichkeit, dass ich ignorieren kann, die auto-Inkrement-identity-Spalte aus #tmp
wenn ich kopieren T
? Meine motivation ist zu vermeiden, dass zu buchstabieren alle Spaltennamen in der Insert Into-Liste.
EDIT: das Umschalten identity_insert würde nicht funktionieren, weil die pkeys in #tmp
kollidieren können, die mit denen in T
wenn Zeilen eingefügt wurden, in T
außerhalb von meinem Skript, dass, wenn #tmp
hat auto-increment der pkey, um die Synchronisierung mit T in den ersten Platz.
1. es gibt mir eine chance, um eine Vorschau der Daten, bevor ich die einfügen 2. Ich habe die Verknüpfungen zwischen temporären Tabellen als Teil meiner Berechnung; temp-Tabellen erlaubt mir, mich zu konzentrieren auf die genaue Menge Daten, die ich arbeite mit. Ich denke, das war es. Irgendwelche Vorschläge/Kommentare?
Eure Aufgabe ist einfach, um doppelte Daten, die schon drin? Oder sind Sie Entrümpelung T, bevor Sie in einfügen?
InformationsquelleAutor Haoest | 2008-09-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Identität generiert wird, während insert-jedenfalls konnte Sie einfach entfernen Sie diese Spalte aus #tmp vor dem einfügen der Daten wieder zu T?
UPD: Hier ist ein Beispiel, das ich getestet habe in SQL Server 2008:
Hi, ich habe versucht, diese, aber das einfügen wieder in die original-Tabelle nicht funktioniert, heißt es "der Spaltenname oder die Anzahl der gelieferten Werte nicht mit der Tabelle definition.". d.h. dieser Befehl "insert into T select * from #tmp" funktioniert nicht.
Ich habe eine voll funktionsfähige test-code, um die Antwort, aber es ist möglich, dass Sie versuchen, Sie zu lösen ein etwas anderes problem, z.B. haben Sie vielleicht die Identität legen Sie schon auf. Wenn andere Antworten auf diese Frage und die Suche, SO werden Ihnen nicht helfen, mag es Sinn machen, erstellen Sie eine neue Frage mit mehr details über Ihre situation.
InformationsquelleAutor DK.
SET IDENTITY_INSERT ON -
INSERT-Befehl
SET IDENTITY_INSERT OFF
Würde die Verpackung es wie eine Transaktion funktionieren?
Ahh, das würde funktionieren. Ich wusste nicht, starten Sie die Transaktion bis #tmp die bereit waren, für das kopieren ( ich habe viele tmps zu berechnen ) zu minimieren-lock-Zeit. Ich denke, jetzt ist es vertretbar.
Ich habe diesen Fehler(mit einer identity-Spalte):Ein expliziter Wert für die Identitätsspalte in Tabelle 'myTable' kann nur angegeben werden, wenn eine Spaltenliste verwendet wird und IDENTITY_INSERT AUF on festgelegt ist.
InformationsquelleAutor Orion Adrian
Finden Sie die Antworten hier und hier:
Grund:
Alle Kredit geht an Eric Humphrey und bernd_k
InformationsquelleAutor sǝɯɐſ
Nicht mit
SELECT *
- wenn Sie jeder Spalte, aber die Identität, es wird in Ordnung sein. Der einzige Weg, den ich sehe, ist, dass Sie dies tun könnte, indem Sie dynamisch Gebäude derINSERT
- Anweisung.InformationsquelleAutor Cade Roux
Nur eine Liste der Spalten, die Sie möchten, zu setzen, sollten Sie nie verwenden, wählen Sie * sowieso. Wenn Sie nicht wollen ,geben Sie Sie einfach ziehen Sie Sie aus dem Objekt-browser (Wenn Sie erweitern Sie die Tabelle, und ziehen Sie das Wort, Spalten, erhalten alle von Ihnen, löschen Sie einfach die id-Spalte)
InformationsquelleAutor HLGEM
Könnte ein "update where T. ID = #tmp.ID" zu arbeiten?
InformationsquelleAutor BCS
INSERT INTO #Tabelle
SELECT MAX(Id) + ROW_NUMBER() OVER(ORDER BY Id)
InformationsquelleAutor Rob Packwood
Verwenden.
InformationsquelleAutor Jasmine
Teil 1-wie bereits erwähnt-durch Kolten in einer der Kommentare, welche Ihre Anweisungen in einer Transaktion und einen parameter hinzufügen, der zum Umschalten zwischen display und verpflichten sich, Ihre Bedürfnisse zu erfüllen. Für Teil 2 würde ich sehen muss, was "Berechnungen", die Sie versuchen. Begrenzen Sie Ihre Daten in eine temp-Tabelle kann über erschwert die situation.
InformationsquelleAutor Rob Allen