在从XLS批处理SQL中插入时使用触发器增加多行FK id



我已经发布了与此问题相关的其他问题,但没有任何回应直接解决从XLS导入多行数据的问题。我通常不经常使用SQL或db,所以我的背景/经验在编写这些查询方面是有限的。如果有更简单或更直接的方法来达到我的目标,我当然愿意接受。我并不是说要重叠,但这个网站似乎是最有帮助的(谢谢每个人谁已经回复了我的其他帖子)。

从我看过的一些帖子中,我知道我有一个基于工作集的查询/触发器(因为多行确实被导入)。最终,我只需要将数据导入父表,子表可以用静态值和/或来自父表的值填充,但是需要维护PK/FK关系。当从XLS导入超过1行数据时,这似乎是我遇到的最大麻烦。

我已经设置了一个触发器,当在父表上执行插入操作时将值插入到子表中。查询执行正确,但是当插入多行数据时,我无法使FK匹配PK。FK总是具有插入到父表中的最后一行的ID。我从其他论坛帖子(这里和其他网站)尝试了几种方法,但总是得到错误。

这是我的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始终匹配。然而,我所看到的例子似乎很难适用于我的导入。

列VersionID的值,看起来是具有IDENTITY的列,在插入的表中。你可以像这样在触发器中引用它

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

如果您想查看INSERT期间插入的数据可用,请将其临时放在触发器中:

SELECT *
FROM inserted

最新更新