Benutzer mit den meisten Antworten
Temporäre Tabelle erstellen

Frage
-
Hallo
Ich möchte einen Datensatz duplizieren. Soweit ich gelesen habe findet sich hier nur der Umweg über eine temporäre Tabelle, ohne alle Felder angeben zu müssen.
Ich habe es folgendermassen versucht:
CREATE TEMPORARY TABLE tmpTest ENGINE=MEMORY SELECT * FROM tblTest WHERE pTest=7101
Da kommt aber die Meldung "Unknown object type 'TEMPORARY' used in a CREATE, DROP, or ALTER statement". Was kann hier das Problem sein?
Danke und Gruss Thomas
Antworten
-
Hallo Thomas,
darf ich mal fragen, wo das Problem daran ist alle Felder anzugeben?
Falls Du Angst vor der Tipparbeit hast, kannst Du Dir im Management Studio aus dem Objekt Explorer einfach den Knoten Columns (Spalten) in eine Abfrage ziehen und bekommst dort die Spaltennamen.
Alternativ kann man es auch über INFORMATION_SCHEMA ermitteln. Z. B. so:
Declare @MyColumns varchar(max); Select @MyColumns = coalesce(@MyColumns,'') + ', ' + COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA = '<mySchema>' and TABLE_NAME = '<MyTable>' order by ORDINAL_POSITION; Select Substring(@MyColumns , 3, LEN(@MyColumns) - 2) as Columns;
HTH!
Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 28. Oktober 2019 07:27
- Als Antwort markiert Alphawolfi Montag, 28. Oktober 2019 10:13
Alle Antworten
-
Hallo Thomas,
da wirfst Du was durcheinander, TEMPORARY TABLE gibt es in MySQL, nicht im MS SQL Server.
In MS werden temporäre Tabelle mit dem Doppelkreuz # gekennzeichnet. Man kann sie manuell erstellen oder mit einem SELECT ... INTO
SELECT * INTO #temp FROM tblTest WHERE pTest=7101; SELECT * FROM #temp
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 28. Oktober 2019 07:24
-
Vielen Dank, das habe ich verstanden und es funktioniert.
Aber wie kriege ich jetzt die Daten in meine Tabelle tblTest zurück? Es hat dort ein Primärfeld mit einem Identity Increment Attribut. Wenn ich die #temp wieder mit Insert into zurückspiele findet SQL es ist nicht möglich wegen dem Primärfeld. Wenn ich vorgängig die Spalte in der Temp-Tabelle lösche meint SQL die Anzahl Felder sei nicht gleich.
Oder einfach nochmal die Frage: Wie kopiere ich einen Datensatz (und gebe dann den neuen Primärschlüssel zurück)?
Danke und Gruss Thomas
-
Hallo Thomas,
SELECT SCOPE_IDENTITY() ist das, was Du suchst. Damit kannst Du den zuletzt in der Sitzung erzeugten IDENTITY Wert ermitteln.
Das solltest Du direkt nach dem INSERT aufrufen und die Rückgabe dann entsprechend verarbeiten.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport- Bearbeitet Stefan FalzModerator Dienstag, 22. Oktober 2019 15:04
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 28. Oktober 2019 07:26
-
Hallo Thomas,
darf ich mal fragen, wo das Problem daran ist alle Felder anzugeben?
Falls Du Angst vor der Tipparbeit hast, kannst Du Dir im Management Studio aus dem Objekt Explorer einfach den Knoten Columns (Spalten) in eine Abfrage ziehen und bekommst dort die Spaltennamen.
Alternativ kann man es auch über INFORMATION_SCHEMA ermitteln. Z. B. so:
Declare @MyColumns varchar(max); Select @MyColumns = coalesce(@MyColumns,'') + ', ' + COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA = '<mySchema>' and TABLE_NAME = '<MyTable>' order by ORDINAL_POSITION; Select Substring(@MyColumns , 3, LEN(@MyColumns) - 2) as Columns;
HTH!
Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 28. Oktober 2019 07:27
- Als Antwort markiert Alphawolfi Montag, 28. Oktober 2019 10:13