Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Массовая вставка в 2 таблицы  [new]
VSR_Faust
Member

Откуда:
Сообщений: 18
есть таблицы:
CREATE TABLE A 
(
ID int IDENTITY(1,1) PK
Type nchar(1)
)
CREATE TABLE B
(
ID_A int PK, FK на A
ID_C int FK на C
)
CREATE TABLE C
(
ID int IDENTITY(1,1) PK
)
на insert в C вешается триггер, который должен вставить строку в A и в B

если вставляется 1 строка то вставка в 2 этапа:
1) insert A(Type) values ('B')
2) insert И(ID_A,ID_C)
select SCOPE_IDENTITY(), ID FROM inserted

а что делать, если строк много? неужели только курсор?
23 авг 09, 00:07    [7570129]     Ответить | Цитировать Сообщить модератору
 Re: Массовая вставка в 2 таблицы  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
VSR_Faust,

select @version что возвращает? Если 2005/2008 сервер, то

declare @a table (id int)
insert A(Type) output inserted.A_ID into @a ...
insert B(id, ID_C) 
from @a
  join C ...
23 авг 09, 00:30    [7570145]     Ответить | Цитировать Сообщить модератору
 Re: Массовая вставка в 2 таблицы  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
declare @a table (id int)
insert A(Type) output inserted.A_ID into @a ...
insert B(id, ID_C) 
from @a
  join inserted ...
23 авг 09, 00:30    [7570146]     Ответить | Цитировать Сообщить модератору
 Re: Массовая вставка в 2 таблицы  [new]
VSR_Faust
Member

Откуда:
Сообщений: 18
а по какому полю тогда соединить inserted и @a, а то join же мне декартово произведение вернет...
23 авг 09, 00:56    [7570158]     Ответить | Цитировать Сообщить модератору
 Re: Массовая вставка в 2 таблицы  [new]
VSR_Faust
Member

Откуда:
Сообщений: 18
Пока придумал только по RowNum, но время выполнения не очень устраивает, есть ещё варианты?

SET NOCOUNT ON

DECLARE @a TABLE (RowNum int IDENTITY(1, 1) , ID int PRIMARY KEY)

INSERT INTO A (Type)
OUTPUT inserted.ID INTO @a
SELECT 5 FROM C;

CREATE TABLE #C (RowNum int IDENTITY(1,1), ID int  PRIMARY KEY)
INSERT INTO #C(ID)
SELECT ID FROM C

INSERT INTO B (ID_A, ID_C)
SELECT t1.ID, r1.ID
FROM @a as t1
INNER JOIN #C as r1
ON r1.RowNum = t1.RowNum
23 авг 09, 02:44    [7570191]     Ответить | Цитировать Сообщить модератору
 Re: Массовая вставка в 2 таблицы  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
VSR_Faust,

жесть какая. Смысл переписывать таблицу C в переменную?

CREATE TABLE A (
  ID_A int IDENTITY(1,1),
  X nchar(1))
GO
CREATE TABLE B (
  ID_A int,
  ID_C int)
GO
CREATE TABLE C (
  ID_C int IDENTITY(1,1),
  N int)
GO
CREATE TRIGGER T ON C
AFTER INSERT
AS
set nocount on

declare @a table (row_id int PRIMARY KEY identity(1,1), ID_A int)

insert A(X)
output inserted.ID_A into @a (ID_A)
select '5'
from inserted

insert B(ID_A, ID_C)
select ID_A, ID_C
from @a a
  join (select ID_C, row_id = row_number() over (order by ID_C) from inserted) c on a.row_id = c.row_id
GO
insert C(N)
select 1 union all
select 2 union all
select 3 union all
select 4
GO
select * from A
select * from B
select * from C
GO
DROP TABLE A
GO
DROP TABLE B
GO
DROP TABLE C
GO
23 авг 09, 04:52    [7570216]     Ответить | Цитировать Сообщить модератору
 Re: Массовая вставка в 2 таблицы  [new]
VSR_Faust
Member

Откуда:
Сообщений: 18
скорость вашего способа с моим - идентична

Но спасибо за более красивое решение
23 авг 09, 12:53    [7570409]     Ответить | Цитировать Сообщить модератору
 Re: Массовая вставка в 2 таблицы  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
VSR_Faust
скорость вашего способа с моим - идентична

Но спасибо за более красивое решение


Уверены? Десяток миллионов записей для начала в таблицу C положите, потом сравнивайте :)
Конкретно, вот эту строку в своем запросе посмотрите:

INSERT INTO #C(ID)
SELECT ID FROM C

23 авг 09, 15:33    [7570539]     Ответить | Цитировать Сообщить модератору
 Re: Массовая вставка в 2 таблицы  [new]
VSR_Faust
Member

Откуда:
Сообщений: 18
это я тестил на всем объеме таблицы
23 авг 09, 17:32    [7570655]     Ответить | Цитировать Сообщить модератору
 Re: Массовая вставка в 2 таблицы  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
VSR_Faust
это я тестил на всем объеме таблицы

Дык. И где планы тестов? Заодно и результат select @@version давайте.
23 авг 09, 18:08    [7570715]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить