Diese Frage kommt dem nahe, was ich brauche, aber mein Szenario ist etwas anders. Die Quell- und Zieltabelle sind identisch und der Primärschlüssel ist eine eindeutige Kennung (guid). Wenn ich das versuche:
insert into MyTable
select * from MyTable where uniqueId = @Id;
Ich erhalte offensichtlich eine Verletzung der Primärschlüsseleinschränkung, da ich versuche, über den Primärschlüssel zu kopieren. Eigentlich möchte ich überhaupt nicht über den Primärschlüssel kopieren. Vielmehr möchte ich eine neue erstellen. Außerdem möchte ich bestimmte Felder selektiv kopieren und die anderen null lassen. Um die Sache komplexer zu gestalten, muss ich den Primärschlüssel des Originaldatensatzes in ein anderes Feld in der Kopie einfügen (Feld PreviousId).
Ich bin mir sicher, dass es eine einfache Lösung dafür gibt. Ich kenne einfach nicht genug TSQL, um zu wissen, was es ist.
quelle
Ok, ich weiß, dass es ein altes Problem ist, aber ich poste trotzdem meine Antwort.
Ich mag diese Lösung. Ich muss nur die Identitätsspalte (n) angeben.
Die "id" -Spalte ist die Identitätsspalte und das ist die einzige Spalte, die ich angeben muss. Es ist sowieso besser als umgekehrt. :-)
Ich benutze SQL Server. Vielleicht möchten Sie "
CREATE TABLE
" und "UPDATE TABLE
" in Zeile 1 und 2 verwenden. Hmm, ich habe gesehen, dass ich nicht wirklich die Antwort gegeben habe, die er wollte. Er wollte die ID auch in eine andere Spalte kopieren. Diese Lösung eignet sich jedoch zum Erstellen einer Kopie mit einer neuen Auto-ID.Ich bearbeite meine Lösung mit den Ideen von Michael Dibbets.
Sie können mehr als eine Spalte löschen, indem Sie sie durch ein "," trennen. Die: id sollte durch die ID der Zeile ersetzt werden, die Sie kopieren möchten. MyDatabase, MyTable und IndexField sollten (natürlich) durch Ihre Namen ersetzt werden.
quelle
TempTable
wäre es nicht zu verwenden besser sein#TempTable
, so dass es eine wahre temporäre Tabelle ist?use MyDatabase; SELECT * INTO #TempTable FROM [TABLE] WHERE [indexfield] = :id; ALTER TABLE #TempTable DROP COLUMN [indexfield]; INSERT INTO [TABLE] SELECT * FROM #TempTable; DROP TABLE #TempTable;
diese Weise weiß ich, dass es so schnell wie möglich ohne Verzögerungen beim Schreiben einer intermittierenden Datei auf die Disc bereinigt wird.$identity
wenn Sie Ihren Identitätsspaltennamen nicht fest codieren möchtenIch vermute, Sie versuchen zu vermeiden, alle Spaltennamen aufzuschreiben. Wenn Sie SQL Management Studio verwenden, können Sie einfach mit der rechten Maustaste auf die Tabelle und das Skript als Einfügen klicken. Dann können Sie mit dieser Ausgabe herumspielen, um Ihre Abfrage zu erstellen.
quelle
Geben Sie alle Felder außer Ihrem ID-Feld an.
quelle
Ich habe das gleiche Problem, bei dem ein einzelnes Skript mit einer Tabelle arbeiten soll, deren Spalten von anderen Entwicklern regelmäßig hinzugefügt werden. Darüber hinaus unterstütze ich viele verschiedene Versionen unserer Datenbank, da Kunden möglicherweise nicht alle mit der aktuellen Version auf dem neuesten Stand sind.
Ich habe die Lösung von Jonas genommen und leicht modifiziert. Auf diese Weise kann ich eine Kopie der Zeile erstellen und dann den Primärschlüssel ändern, bevor ich ihn wieder in die ursprüngliche Quelltabelle einfüge. Dies ist auch sehr praktisch, wenn Sie mit Tabellen arbeiten, die keine NULL-Werte in Spalten zulassen und nicht jeden Spaltennamen in INSERT angeben müssen.
Dieser Code kopiert die Zeile für 'ABC' nach 'XYZ'.
Sobald Sie fertig sind, legen Sie die temporäre Tabelle ab.
quelle
Ich weiß, dass meine Antwort zu spät zur Party kommt. Aber die Art und Weise, wie ich es gelöst habe, ist etwas anders als alle Antworten.
Ich hatte eine Situation, ich muss eine Zeile in einer Tabelle mit Ausnahme weniger Spalten klonen. Diese wenigen werden neue Werte haben. Dieser Prozess sollte zukünftige Änderungen an der Tabelle automatisch unterstützen. Dies bedeutet, dass Sie den Datensatz klonen müssen, ohne Spaltennamen anzugeben.
Mein Ansatz ist,
quelle
quelle
Wenn "Schlüssel" Ihr PK-Feld ist und es automatisch numerisch ist.
Es wird ein neuer Datensatz generiert, wobei Feld1 und Feld2 aus dem ursprünglichen Datensatz kopiert werden
quelle
Meine Tabelle enthält 100 Felder, und ich brauchte eine Abfrage, um einfach zu funktionieren. Jetzt kann ich eine beliebige Anzahl von Feldern mit einer grundlegenden bedingten Logik ausschalten und mich nicht um ihre Ordnungsposition kümmern.
Ersetzen Sie den folgenden Tabellennamen durch Ihren Tabellennamen
Ersetzen Sie den ursprünglichen Identitätsfeldnamen durch Ihren PK-Feldnamen
Ersetzen Sie die Tabellennamen erneut (sowohl den Namen der Zieltabelle als auch den Namen der Quelltabelle). Bearbeiten Sie Ihre
where
Bedingungenquelle
Sie können dies tun:
Dort sollten Sie anstelle von 112 eine Nummer der maximalen ID in die Tabelle DENI / FRIEN01P eintragen.
quelle
Hier ist, wie ich es mit ASP classic gemacht habe und es mit den obigen Antworten nicht ganz zum Laufen bringen konnte. Ich wollte in der Lage sein, ein Produkt in unserem System in eine neue product_id zu kopieren und brauchte es, um auch dann funktionieren zu können Fügen Sie der Tabelle weitere Spalten hinzu.
quelle