Problem: Schleife anwenden

DasChamaeleon

Neuer Benutzer
Beiträge
2
Hallo,
ich habe folgenden Code. Manch einer wird vielleicht schon erkennen,
auf welche Umgebung er ausgelegt ist.
Wenn ich den Code praktisch für jede Tabelle seperat ausführen lasse, funktioniert alles.
Es soll jedoch dynamischer gestaltet werden. Daher habe ich eine Tabelle und eine Schleife eingebaut, leider funktioniert es nicht, wie geplant. Wo liegt mein Fehler? Ich habe... ach, seht selbst! :)

/*Variablen deklarieren*/
DECLARE @FromDB sysname;
DECLARE @ToDB sysname;
DECLARE @Temp varchar(20);
DECLARE @i Integer;
DECLARE @j Integer;

/*ACHTUNG: Hier muss die Ursprungs- und die Zieldatenbank eingetragen werden*/
SET @FromDB = QUOTENAME('Ursprungs_DB');
SET @ToDB = QUOTENAME('Ziel_DB');

/*Als Arrayersatz erzeuge und beschreibe ich eine Tabelle*/
DROP TABLE NeedToCopy;
CREATE TABLE NeedToCopy (id int, name text);
INSERT INTO NeedToCopy VALUES (1, '[User Group Access Control]');
INSERT INTO NeedToCopy VALUES (2, '[User Group Permission Set]');
INSERT INTO NeedToCopy VALUES (3, '[User Group Member]');
INSERT INTO NeedToCopy VALUES (4, '[User Group]');
INSERT INTO NeedToCopy VALUES (5, '[User Property]');
INSERT INTO NeedToCopy VALUES (6, '[User Personalization]');
INSERT INTO NeedToCopy VALUES (7, '[User]');
INSERT INTO NeedToCopy VALUES (8, '[Access Control]');
INSERT INTO NeedToCopy VALUES (9, '[Permission]');
INSERT INTO NeedToCopy VALUES (10, '[Permission Set]');
INSERT INTO NeedToCopy VALUES (11, '[Profile]');

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

/*Übernimmt die Tabellen aus der alten in die Neue Datenbank*/
SET @i = 1;
EXEC ('SELECT ' + @j + '=COUNT(id) FROM NeedToCopy');
While @i < @j + 1
BEGIN
EXEC ('SELECT ' + @Temp + '=name FROM NeedToCopy WHERE id = ' + @i);
EXEC ('DROP TABLE ' + @ToDB + '.[dbo].' + @Temp);
EXEC ('SELECT * INTO ' + @ToDB + '.[dbo].' + @Temp + ' FROM ' + @FromDB + '.[dbo].' + @Temp);
SET @i = @i + 1;
END;

DROP TABLE NeedToCopy;
 
Werbung:
Also deine Tabelle NeedToCopy hat eine Spalte "name" als Format TEXT? Ich würde VARCHAR() oder ähnliches bevorzugen, wenn der Wert später irgendwo in dynamischem SQL verwendet werden soll dann wäre das glaube ich besser.

Dein erstes EXEC ruft einen verketteten String auf der @Temp einbindet, das sollte aber zu dem Zeitpunkt NULL sein oder? Ergo ist der ganze Aufruf EXEC(NULL). Das gleiche wiederholt sich dann beim zweiten und dritten EXEC().
Der erste EXEC() ist eigentlich gar nicht nötig:
Code:
SELECT @Temp = name FROM NeedToCopy WHERE id = @i;
...dürfte tun was du suchst, die Variable setzen. Danach wird dann allerdings die Tabelle gedropt und dann ein SELECT INTO gemacht, ich würde sagen die Tabelle muss erst noch erzeugt werden.
 
Zurück
Oben