Transact-SQL: вставить в XYZ (выберите * из abc) - PullRequest
2 голосов
/ 26 мая 2009

я хочу реализовать конструкцию в MS SQL, которая выглядела бы следующим образом в Oracle O PL / 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;

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

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

Ответы [ 5 ]

6 голосов
/ 26 мая 2009

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

Хорошо:

SELECT column1, column2, column3 INTO abc FROM xyz

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

INSERT INTO abc SELECT column1, column2, column3 FROM xyz

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

Приветствие Johannes

3 голосов
/ 26 мая 2009

Версия без курсора, но с временным столбцом:

-- //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;
2 голосов
/ 26 мая 2009
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

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

1 голос
/ 26 мая 2009

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

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

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

P.S .: как уже отмечалось, вы уже создали таблицу abc

0 голосов
/ 07 ноября 2009

Надеюсь, это то, что вы ищете:

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 .

Пожалуйста, посетите эту страницу MSDN для полной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...