увеличивать множественные идентификаторы FK строк с помощью триггера при вставке из пакетного SQL XLS - PullRequest
1 голос
/ 26 июля 2011

Я опубликовал другие вопросы, относящиеся к этой проблеме, но у меня не было ответов, чтобы напрямую решить проблему импорта данных из нескольких строк из XLS.Я нечастый пользователь SQL или БД в целом, поэтому мой опыт / знания ограничен в написании этих запросов.Если есть более простой или более прямой подход к достижению моей цели, я, безусловно, открыт для них.Я не имею в виду перепост или что-то еще, но этот сайт, кажется, наиболее полезен (спасибо всем, кто ответил на мой другой пост).

Из некоторых постов, на которые я смотрел, я понимаю, что яиметь рабочий набор / запрос на основе набора (так как несколько строк импортируются).В конечном счете мне нужно только импортировать данные в родительскую таблицу, и дочерняя таблица может быть заполнена статическими значениями и / или значениями из родительской таблицы, но необходимо поддерживать связь PK / FK.И это то, с чем у меня больше всего проблем, когда из XLS импортируется более 1 строки данных.

Я настроил триггер для вставки значений в дочернюю таблицу, когда вставка выполняется вродительская таблица.Запрос выполняется правильно, однако я не могу заставить FK соответствовать PK, когда вставлено несколько строк данных.FK всегда имеет идентификатор последней строки, вставленной в родительскую таблицу.Я пробовал несколько подходов из других сообщений форума (здесь и на других сайтах), но всегда получаю ошибки.

Вот мой код триггера updatePgVer:

ALTER TRIGGER [updatePgVer]
   ON  [prototype].[dbo].[PageVersion]
FOR INSERT AS 
   BEGIN
    SET NOCOUNT ON;

-- Insert into PageHistory
INSERT 
INTO [prototype].[dbo].[PageHistory] ([VersionID], [Date], [Action], [Who], [StateId], [Owner])
SELECT 
    @@IDENTITY
    , GETDATE()
    , 'created'
    , 'xls_user'
    , [StateID]
    , 'xls_user'
FROM inserted

END

И запрос, используемый для вставки вродительская таблица:

INSERT INTO [prototype].[dbo].[PageVersion] ([Number], [PageId], [Properties], [StateId], [Language], [SearchText], [PageMetaDescription], [PageMetaKeyWords], [PageTypeId], [Name], [Title], [Owner], [Admin], [ShowInMenu])
SELECT [Number], [PageId], [Properties], [StateId], [Language], [SearchText], [PageMetaDescription], [PageMetaKeyWords], [PageTypeId], [Name], [Title], [Owner], [Admin], [ShowInMenu]
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\test_import.xls', 'SELECT * FROM [Query$]');

Единственная другая идея, которую я имею, заключается в том, чтобы создать какой-то цикл, который проходит через каждую строку и импортирует по 1 за раз, так что @@ IDENTITY всегда будет совпадать.Однако примеры, на которые я смотрел, кажутся трудно применимыми к моему импорту.

1 Ответ

0 голосов
/ 26 июля 2011

Значение для столбца VersionID, который выглядит как столбец с IDENTITY, находится во вставленной таблице. Вы можете ссылаться на него в своем триггере, как это

INSERT 
INTO [prototype].[dbo].[PageHistory] ([VersionID], [Date], [Action], [Who], [StateId], [Owner])
SELECT 
    [VersionID],
    , GETDATE()
    , 'created'
    , 'xls_user'
    , [StateID]
    , 'xls_user'
FROM inserted

Если вы хотите увидеть, какие данные доступны при вставке во время ВСТАВКИ, временно вставьте это в свой триггер:

SELECT *
FROM inserted
...