none
Temporäre Tabelle erstellen RRS feed

  • 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

    Dienstag, 22. Oktober 2019 12:51

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

    Mittwoch, 23. Oktober 2019 05:39

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]

    Dienstag, 22. Oktober 2019 14:12
  • 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

    Dienstag, 22. Oktober 2019 14:51
  • 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


    Dienstag, 22. Oktober 2019 15:04
    Moderator
  • 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

    Mittwoch, 23. Oktober 2019 05:39
  • Ich habe mit Eure Hilfe jetzt eine Stored Procedure gemacht, die das macht was ich will. Vielen Dank.


    Danke und Gruss Thomas

    Montag, 28. Oktober 2019 10:24