Column List übergabe

DasChamaeleon

Neuer Benutzer
Beiträge
2
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;
 
Werbung:
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?
 
Zurück
Oben