2009-05-26 8 views
2

je veux réaliser une construction dans MS SQL qui ressemblerait à ceci dans Oracles PL/SQL:Transact-SQL: insérer dans xyz (select * from abc)

declare 
asdf number; 
begin 
for r in (select * from xyz) loop 
    insert into abc (column1, column2, column3) 
    values (r.asdf, r.vcxvc, r.dffgdfg) returning id into asdf; 

    update xyz set column10 = asdf where ID = r.ID; 
end loop; 
end; 

Toute idée comment réaliser cela soit utile.

Merci à l'avance

+0

Davis, s'il vous plaît revenir à l'aide d'un curseur, vous ne devriez pas, si toute utilisation possible un curseur dans sql server, car ils sont extrêmement lents par rapport aux solutions-set. Des solutions basées sur des ensembles ont été fournies et vous devriez les considérer. Puisque vous convertissez à partir d'Oracle, vous devez cesser de penser en termes de boucles et commencer à penser à des ensembles de données lorsque vous travaillez avec SQL Server. – HLGEM

Répondre

2
declare @asdf int/varchar -- unsure of datatype 
declare @vcxvcint/varchar -- unsure of datatype 
declare @dffgdfg int/varchar -- unsure of datatype 
declare @id int  
declare db_cursor CURSOR FOR SELECT asdf, vcxvc, dffgdfg FROM xyz 

OPEN db_cursor 
FETCH NEXT FROM db_cursor 
INTO @asdf, @vcxvcint, @dffgdfg 

WHILE @@FETCH_STATUS = 0 
BEGIN  
    insert into abc (column1, column2, column3) values (@asdf, @vcxvcint, @vcxvcint)  
    set @id = scope_identity() -- This will get the auto generated ID of the last inserted row 
    update xyz set column10 = @asdf where id = @  
    FETCH NEXT FROM db_cursor INTO @name  
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 

Naturellement, tous les administrateurs de bases de données vont vous tuer si vous essayez de placer un curseur dans le code de production.

+0

Pourquoi les administrateurs de bases de données seraient-ils contrariés par les curseurs? – Andomar

+1

Curseurs Becasue sont des tueurs de performance et devraient être remplacés par un code basé sur un ensemble. Je comprends que ce n'est pas si vrai dans Oracle, mais c'est dans SQL Server. – HLGEM

6

Cela semble être simplement une copie d'une table, à droite?

bien:

SELECT column1, column2, column3 INTO abc FROM xyz 

Je pense que vous pourriez aussi quelque chose comme

INSERT INTO abc SELECT column1, column2, column3 FROM xyz 

mais dans le second cas, vous devez créer la table avant, le premier ne place créer aussi le tableau

Vive Johannes

3

Version sans le curseur, mais avec la colonne de température:

-- //temporarily add the column (assume the table "abc" already exists) 
ALTER TABLE "abc" ADD xyzID INT; 
GO; 
-- //insert all the data (assuming the ID field on "xyz" is called ID) 
INSERT INTO "abc" (column1, column2, column3, xyzID) SELECT asdf, vcxvc, rdffgdfg, ID FROM "xyz"; 
-- //update "xyd" with the new ID 
UPDATE "xyd" SET column10 = "abc".ID FROM "xyd" INNER JOIN "abc" ON "xyd".ID = "abc".xydID 
-- //drop the temporary column 
ALTER TABLE "abc" DROP COLUMN xyzID; 
1

Si je comprends bien ce que vous avez demandé (je ne suis pas compétent avec PL/SQL), ressemble à une tâche assez facile:

INSERT INTO abc(column1, column2, column3) SELECT asdf, vcxvc, dffgdfg FROM xyz; 
UPDATE xyz SET column10 = id; 

Mais je devine juste votre intention, j'espère ne pas avoir mal compris.

PS: comme someelse déjà fait, vous devez avoir créé la table abc

+0

cela résout seulement la moitié du problème, comme David aimerait aussi avoir des FK pour les données nouvellement créées – van

+0

Vous avez raison: je n'ai pas prêté assez d'attention à ce "retour id en asdf" ... Merci –

0

Hope this est ce que vous cherchez:

declare 
asdf number; 
begin 
for r in (select * from xyz) loop 
    insert into abc (column1, column2, column3) 
    values (r.asdf, r.vcxvc, r.dffgdfg) returning id into asdf; 

    update xyz set column10 = asdf where ID = r.ID; 
end loop; 
end; 

deviendrait

DECLARE @asdf int 
DECLARE @ID int 
DECLARE @MyTmpTableVar table(asdf int, abc_id int) 

// insert records from your cursor r into table abc, 
// and return a temporary table with "id" and "asdf" fields from the xyz table 
INSERT INTO abc(column1, column2, column3) 
OUTPUT asdf, id INTO @MyTmpTableVar 
SELECT r.asdf, r.vcxvc, r.dffgdfg 
FROM xyz 

// if it would return just one row and you wanted to find the value 
//SELECT @asdf = asdf, @id = abc_id 
//FROM @MyTmpTableVar 

// update the table xyz with the values stored in temporary table 
// restricting by the key "id" 
UPDATE xyz 
SET xyz.column10 = t.asdf 
FROM @MyTmpTableVar AS t 
WHERE xyz.id = t.abc_id 

La version sqlServer du La clause de retour dans Oracle est la clause OUTPUT.

S'il vous plaît visitez this msdn page pour une information complète

Questions connexes