2009-05-26 1 views
2

я хочу, чтобы реализовать конструкцию в MS SQL, который будет выглядеть, как это в Оракулы PL/SQL:Transact-SQL: вставить в АБВ (выберите * из аЬс)

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; 

Любая идея, как реализовать это будет быть полезным.

Заранее спасибо

+0

Davis, пересмотрите с помощью курсора, вы не должны, если это вообще возможно использовать курсор в SQL Server, так как они очень медленно по сравнению с установить на основе решений. Были предоставлены комплексные решения, и вы должны их рассмотреть. Когда вы конвертируете из Oracle, вам нужно перестать думать с точки зрения циклов и начать думать о промежутках между наборами данных при работе с SQL Server. – HLGEM

ответ

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 

Конечно, в основном все DBA убьют вас, если вы попробуете и подкрадете курсор в производственный код.

+0

Зачем DBA расстраиваются курсорами? – Andomar

+1

becasue cursors являются исполнительными киллерами и должны быть заменены на установочный код. Я понимаю, что это не так верно в Oracle, но это в SQL Server. – HLGEM

6

Это кажется просто копия одной таблицы, не так ли?

Ну:

SELECT column1, column2, column3 INTO abc FROM xyz 

Я думаю, вы могли бы также что-то вроде

INSERT INTO abc SELECT column1, column2, column3 FROM xyz 

, но во втором случае вам нужно, прежде чем создать таблицу, первый вместо делает также создать таблицу

Cheers Johannes

3

версии без курсора, но с колонкой TEMP:

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

Если бы я понял, что вы спросили (я не опытен с PL/SQL), выглядит как довольно простая задача:

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

Но я просто догадываюсь о вашем намерении, надеюсь, что вы не поняли неправильно.

PS: а someelse уже отмечалось, вы должны уже создали таблицу абв

+0

это решает только 1/2 проблемы, так как Дэвид также хотел бы иметь FK для вновь созданных данных – van

+0

Вы правы: я не обращал достаточного внимания на то, что «возвращение id в asdf» ... Спасибо –

0

Надежда это то, что вы ищете:

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; 

станет

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 

Версия sqlServer предложение о возврате в Oracle - это статья OUTPUT.

Пожалуйста, посетите this msdn page для получения полной информации

Смежные вопросы