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;
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;