1

我已经发布了与此问题相关的其他问题,但没有任何回应直接解决从 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 始终匹配。但是,我看过的示例似乎很难应用于我的导入。

4

1 回答 1

0

列 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
于 2011-07-25T22:43:13.767 回答