2010-05-13 6 views
0

Допустим, у меня есть таблица (все очень упрощенный):вставки данных в несколько таблиц

create table OriginalData (
ItemName NVARCHAR(255) not null 
    ) 

И я хотел бы вставить свои данные (набор на основе!) На две таблицы, которые модель наследования

create table Statements (
     Id int IDENTITY NOT NULL, 
ProposalDateTime DATETIME null 
    ) 

create table Items (
     StatementFk INT not null, 
     ItemName NVARCHAR(255) null, 
     primary key (StatementFk) 
    ) 

Утверждения - это родительская таблица, а Items - дочерняя таблица. У меня нет проблем делать это с одной строкой, которая связана с использованием IDENT_CURRENT, но я понятия не имею, как это сделать на основе набора (т. Е. Введите несколько строк в обе таблицы).

Спасибо.

С наилучшими пожеланиями,

христианские

+2

Я не имею ни малейшего представления, что вы пытаетесь сделать. Как столбцы в исходной карте сопоставляются таблицам состояний и элементов? –

+0

извините KM Я его отредактировал - теперь должен иметь смысл. – cs0815

+0

BTW никогда не использует ident_current, он добавит последнюю идентификацию, которая не может быть вашей, у нас был dev, полностью испортивший целостность данных, используя это, когда два разных пользователя вставили одновременно. – HLGEM

ответ

1

Другой возможный метод, который бы предотвратить использование курсоров, которая, как правило, не лучший практика для SQL, приведена ниже ... Она использует предложение OUTPUT для захвата результатов вставки из одной таблицы, которая будет использоваться во вставке во вторую таблицу.

Примечание. В этом примере делается одно предположение о том, что я переместил столбец IDENTITY в таблицу Items. Я считаю, что это было бы приемлемо, по крайней мере, на основе исходного макета таблицы, поскольку основным ключом этой таблицы является столбец StatementFK.

Примечание Этот пример кода был протестирован с помощью SQL 2005 ...


IF OBJECT_ID('tempdb..#OriginalData') IS NOT NULL 
    DROP TABLE #OriginalData 
IF OBJECT_ID('tempdb..#Statements') IS NOT NULL 
    DROP TABLE #Statements 
IF OBJECT_ID('tempdb..#Items') IS NOT NULL 
    DROP TABLE #Items 

create table #OriginalData 
(ItemName NVARCHAR(255) not null) 

create table #Statements 
(Id int NOT NULL, 
    ProposalDateTime DATETIME null) 

create table #Items 
(StatementFk INT IDENTITY not null, 
    ItemName NVARCHAR(255) null, 
    primary key (StatementFk)) 

INSERT INTO #OriginalData 
    (ItemName ) 
      SELECT 'Shirt' 
UNION ALL SELECT 'Pants' 
UNION ALL SELECT 'Socks' 
UNION ALL SELECT 'Shoes' 
UNION ALL SELECT 'Hat' 

DECLARE @myTableVar table 
    (StatementFk int, 
    ItemName nvarchar(255)) 

INSERT INTO #Items 
    (ItemName ) 
OUTPUT INSERTED.StatementFk, INSERTED.ItemName 
INTO @myTableVar 
SELECT ItemName 
FROM #OriginalData 

INSERT INTO #Statements 
    (ID, ProposalDateTime ) 
SELECT 
    StatementFK, getdate() 
FROM @myTableVar 
+0

OUTPUT - предпочтительный mathod, если вы используете отвращение SQL Server, который может его использовать. – HLGEM

0

Вам нужно будет написать процесс ETL, чтобы сделать это. Вы можете посмотреть в SSIS.

Это также можно сделать с помощью таблиц t-sql и, возможно, временных. Возможно, вам понадобится сохранить уникальный ключ из OriginalTable в таблице Statement, а затем, когда вы вставляете Items - присоедините OriginalTable с помощью выражений на этом уникальном ключе, чтобы получить идентификатор.

0

Я не думаю, что вы могли бы сделать это в один кусок, но вы могли бы, конечно, сделать это с петлей курсора

DECLARE @bla char(10) 
DECLARE @ID int 

DECLARE c1 CURSOR 
FOR 
SELECT bla 
FROM OriginalData 

OPEN c1 

FETCH NEXT FROM c1 
INTO @bla 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    INSERT INTO Statements(ProposalDateTime) VALUES('SomeDate') 
     SET @ID = SCOPE_IDENTITY() 
     INSERT INTO Items(StateMentFK,ItemNAme) VALUES(@ID,@bla) 
    FETCH NEXT FROM c1 
    INTO @bla 

END 

CLOSE c1 
DEALLOCATE c1 
+0

Спасибо, что это работает хорошо - не использовали курсоры какое-то время – cs0815

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