Мульти вставка с scope_identity, как? - PullRequest
1 голос
/ 08 апреля 2019

У меня проблема с командой SSIS OLE DB.то, что я пытаюсь сделать, это вставить в таблицу "person" и захватить вновь созданный PersonID (идентификатор таблицы) из вставки, поскольку мне нужно это для создания отношения в таблице PersonContactInfo, это должно быть довольно просто.

Я не могу выполнить сохраненную процедуру, и там около 10 тыс. Строк, поэтому с OLE DB-командой все должно быть в порядке

Я попытался написать этот код, и он должен соответствовать:

DECLARE @PersonID int
---
--- create new person
---
INSERT  INTO [dbo].[Personer_LF_TEST](Fornavne, Efternavne, Oprindelse, OprettetDato, OprettetAf,OprindelseID)
VALUES  (?, ?, 'Klimaquiz', ?, 499,7)
SET @PersonID = (SELECT scope_identity())
---
--- update phonenumber
---
INSERT  INTO [dbo].[Kontaktinfo_LF_TEST](PersonID, KontaktInfoTypeID, Notat, Tekst, Oprettet)
VALUES  (@PersonID, 5, ?,?, Getdate() )
---
--- update Email
---
INSERT  INTO [dbo].[Kontaktinfo_LF_TEST](PersonID, KontaktInfoTypeID, Notat, Tekst, Oprettet)
VALUES  (@PersonID, 2,?, ?, Getdate() )
---
--- create persontypecode
---
INSERT  INTO [dbo].[PersonArtskoder_LF_TEST](PersonID, ArtskoderID, Notat, Aktiv, CreatedBy, CreatedOn, ModifiedBy, ModifiedOn, StartDato, SlutDato)
VALUES  (@PersonID,?, ?, 1, 209, getdate(), 209, getdate(), getdate(), NULL )

Я также попытался просто запустить первую часть с успехом, как это:

-- Create new Person
INSERT  INTO [dbo].[Personer_LF_TEST](Fornavne,Efternavne,Oprindelse,OprettetDato,OprettetAf,OprindelseID)
VALUES(?, ?,'Klimaquiz',?,499,7)

, которая вставляет 10 тыс. Строк

, если попытаться это сделать, это не удастся

-- Create new person
INSERT INTO [dbo].[Personer_LF_TEST](Fornavne,Efternavne,Oprindelse,OprettetDato,OprettetAf,OprindelseID)
VALUES(?, ?,'Klimaquiz',?,499,7)
-- Insert Phone number
INSERT  INTO [dbo].[Kontaktinfo_LF_TEST](PersonID, KontaktInfoTypeID, Tekst, Oprettet)
VALUES  (1,5,?,Getdate())

текст ошибки:

Ошибка в задаче потока данных [Команда OLE DB [178]]: код ошибки SSIS dts_E_OLEDBERROR.произошла ошибка OLE DB.

Код ошибки: 0x80004005.Доступна запись OLE DB.Источник: «Собственный клиент Microsoft SQL Server 11.0». Hresult: 0x80004005 Описание: «Вставить список значений не соответствует списку столбцов»

Но входные данные должны соответствовать списку столбцов.

это "своего рода" код, который я хотел бы, чтобы команда OLD DB выполняла

DECLARE @PersonID int
---
--- create new person
---
INSERT  INTO [dbo].[Personer_LF_TEST](Fornavne, Efternavne, Oprindelse, OprettetDato, OprettetAf,OprindelseID)
VALUES  ('Simster', 'Mann', 'Klimaquiz', '03-25-2019', 499,7)
SET @PersonID = (SELECT scope_identity())
---
--- update phonenumber
---
INSERT  INTO [dbo].[Kontaktinfo_LF_TEST](PersonID, KontaktInfoTypeID, Notat, Tekst, Oprettet)
VALUES  (@PersonID, 5, 'WEB','22004400', Getdate() )
---
--- update Email
---
INSERT  INTO [dbo].[Kontaktinfo_LF_TEST](PersonID, KontaktInfoTypeID, Notat, Tekst, Oprettet)
VALUES  (@PersonID, 2,'WEB', 'Simster@codewithme.dk', Getdate() )
---
--- create persontypecode
---
INSERT  INTO [dbo].[PersonArtskoder_LF_TEST](PersonID, ArtskoderID, Notat, Aktiv, CreatedBy, CreatedOn, ModifiedBy, ModifiedOn, StartDato, SlutDato)
VALUES  (@PersonID,'30395', 'WEB', 1, 209, getdate(), 209, getdate(), getdate(), NULL )

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Я думаю, что лучший подход - разбить это на кусочки.

Добавление редактирования для обработки SSIS по этой ссылке http://radacad.com/output-parameter-of-stored-procedure-in-ole-db-command-ssis:

  1. Считайте ваши данные в поток данных.

1.1 (РЕДАКТИРОВАТЬ) Добавить производный столбец и установить идентификатор как ноль (dt_int)

  1. Используйте команду OLE DB для вставки новой строки и возврата идентификатора области в столбец.

2.1 (РЕДАКТИРОВАТЬ) Сопоставить ваш столбец с выходным параметром хранимой процедуры, которая возвращает scope_identity ()

  1. Использовать многоадресную рассылку и задать 3 новых пути к производным столбцам
  2. Использовать производные столбцы для ввода жестко закодированных значений
  3. Используйте назначение OLEDB для одновременной вставки всех записей.

Это позволяет вам массово вставить 3 последующих запроса.

Позднее редактирование:

Как я уже сказал, я быстр в компоненте C # script, и это пример того, как это сделать ...

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

1 голос
/ 08 апреля 2019

Если я выполню этот запрос с фиктивными данными в SSMS, у меня не возникнет проблем с его выполнением,

DECLARE @PersonID int
---
--- create new person
---
INSERT  INTO [dbo].[Personer_LF_TEST](Fornavne, Efternavne, Oprindelse, OprettetDato, OprettetAf,OprindelseID)
VALUES  ('TEST', 'Simmy', 'Klimaquiz', GETDATE(), 499,7)
SET @PersonID = (SELECT scope_identity())
---
--- update phonenumber
---
INSERT  INTO [dbo].[Kontaktinfo_LF_TEST](PersonID, KontaktInfoTypeID, Notat, Tekst, Oprettet)
VALUES  (@PersonID, 5, 'WEB',33445566, Getdate() )
---
--- update Email
---
INSERT  INTO [dbo].[Kontaktinfo_LF_TEST](PersonID, KontaktInfoTypeID, Notat, Tekst, Oprettet)
VALUES  (@PersonID, 2,'WEB', 'simster@codewithme.dk', Getdate() )
---
--- create persontypecode
---
INSERT  INTO [dbo].[PersonArtskoder_LF_TEST](PersonID, ArtskoderID, Notat, Aktiv, CreatedBy, CreatedOn, ModifiedBy, ModifiedOn, StartDato, SlutDato)
VALUES  (@PersonID,'30895', 'WEB', 1, 209, getdate(), 209, getdate(), getdate(), NULL ) 

Я успешно вставил 4 строки, но не могу заставить его работать в объекте OLE DB Command. Я думал добавить столбец в поток, а затем добавить команду execute sql после потока данных, после чего команда execute SQL будет основываться на вводе в столбец либо вставлять, обновлять, либо удалять / ничего не делать. Но это кажется утомительным обходным путем.

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