Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Column List übergabe

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von DasChamaeleon, 16 Oktober 2016.

  1. DasChamaeleon

    DasChamaeleon Neuer Benutzer

    He Leute.

    ich möchte eine Datenbank (ausgewählte Tabellen) in eine andere Datenbank schreiben. Die Primärschlüssel müssen erhalten bleiben, daher kann ich sie nicht einfach droppen. In meiner Liste befinden sich viel mehr Tabellen als in dem Beispiel unten. Daher kann ich auch nicht hingehen und jede Tabelle mit den Spalten auslesen und nur die Spalten (außer timestamp ebend) einfügen. Jetzt langsam verzweifle ich. Die ColumnList ist vorgegeben, ich kann die Leerzeichen also nicht händisch entfernen. Ich kann auch weder eine eckige Klammer [ noch Anführungszeichen " in meinen @String vom Typ VARCHAR einfügen. Ich habe schon sehr viel versucht, kann jetzt auch nicht mehr alles außschließend hier erwähnen.


    Der Print @String Befehl liefert: App ID, Company Name, Role ID, Scope ....
    Ich bräuchte aber zum Beispiel [App ID], [Company Name], ....

    Bitte ... HILFE! :)

    Gruss

    Ganzer Code:
    /*Variablen deklarieren*/
    DECLARE @FromDB SYSNAME;
    DECLARE @ToDB SYSNAME;
    DECLARE @Temp VARCHAR(100);
    DECLARE @Temp2 VARCHAR(100);
    DECLARE @i INTEGER;
    DECLARE @j INTEGER;
    DECLARE @k INTEGER;
    DECLARE @l INTEGER;
    DECLARE @String VARCHAR(max);

    /*ACHTUNG: Hier muss die Ursprungs- und die Zieldatenbank eingetragen werden*/
    SET @FromDB = QUOTENAME('Demo Database NAV (9-0)');
    SET @ToDB = QUOTENAME('Database NAV (9-0)');

    /*Spricht die beiden Tabellen an*/
    EXEC ('USE ' + @FromDB);
    EXEC ('USE ' + @ToDB);

    /*Als Arrayersatz erzeuge und beschreibe ich eine Tabelle*/
    CREATE TABLE NeedToCopy (id INTEGER, name TEXT);
    INSERT INTO NeedToCopy VALUES (1,'User Group Access Control');

    /*Übernimmt die Tabelle aus der alten in die neue Datenbank*/
    SET @i = 1;
    SELECT @j=COUNT(id) FROM NeedToCopy;

    WHILE @i < @j + 1 BEGIN
    SELECT @Temp=name FROM NeedToCopy WHERE id = @i;
    SELECT rank() OVER (ORDER BY name) AS ID, s.name INTO TempTable FROM syscolumns s WHERE id=OBJECT_ID(@Temp) AND name !='timestamp';
    SELECT @String=name FROM TempTable WHERE ID = 1;
    SET @k = 2;
    SELECT @l=COUNT(ID) FROM TempTable;

    WHILE @k < @l + 1 BEGIN

    SELECT @String=@String + ', ' + name FROM TempTable WHERE ID = @k;
    SET @k = @k + 1;

    END;

    PRINT @String;
    EXEC ('DELETE FROM ' + @ToDB + '.[dbo].[' + @Temp + ']');
    EXEC ('INSERT INTO ' + @ToDB + '.[dbo].[' + @Temp + '] (' + @String + ') SELECT ' + @String + ' FROM ' + @FromDB + '.[dbo].[' + @Temp + ']');
    SET @i = @i + 1;
    END;

    DROP TABLE NeedToCopy;
    DROP TABLE TempTable;
     
  2. ukulele

    ukulele Datenbank-Guru

    Also erstmal zum Verständnis:
    a) Du hast einen INT als Primary Key in deiner Ausgangstabelle und der wird (per IDENTITY?) hoch gezählt?
    b) Das mit den Klammern und den Anführungszeichen verstehe ich nicht ganz, du willst die manuell an einen String hängen?
    Code:
    DECLARE @i VARCHAR(100) SET @i = '' SET @i = @i + '[' SET @i = @i + '''' /*doppeltes Anführungszeichen = 1 Zeichen im String*/
    c) Das Timestamp-Format hat nichts mit Zeit zu tun, es ist einfach ein Zähler. Den kann man auch nicht manuell einfügen und der taugt auch nicht als Primary Key. Wenn du die Spalte timestamp ansprichst, welches Format hat die wirklich? Ist das vielleicht nur ein Datum?
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden