【问题标题】:How to import data with SSIS for sequential guids?如何使用 SSIS 导入数据以获取顺序指南?
【发布时间】:2011-01-12 16:21:04
【问题描述】:

是否有将数据导入我希望 PK 是顺序 guid 的 SSIS?

到目前为止,我能想到的唯一方法是创建一个临时表,其列默认为newsequentialid(),在其中加载数据,然后将其复制到正确的表中。这不是很优雅,而且必须在我的包中添加一堆额外的层来适应这一点有点费时。

【问题讨论】:

    标签: sql-server-2008 ssis data-import newsequentialid


    【解决方案1】:

    我不使用 GUID 作为 PK,但您不能将 newsequentialid() 设置为默认值,那么任何插入到您的数据库中的内容都会使用它。

    【讨论】:

    • 问题在于外键关系,如果我无法在 SSIS 中生成键,我需要使用一个临时表,以便我可以在 SSIS 中读取它,这样我就可以定义要设置的键外键关系
    • 我选择了这个答案,因为这正是我目前正在做的事情。
    【解决方案2】:

    你看过OUTPUT clause吗?

    基本上,您将插入的任何内容(包括身份字段)输出到表变量或临时表中。如果另一个表具有外键关系,则不能将其直接插入到另一个表中。每当我使用它时,我都会使用一个临时表,然后从那里插入到子表中。

    这是一个使用示例:

    DECLARE @roles TABLE (
        SecurityRoleId int
    )
    
    INSERT dbo.SecurityRole (
        SecurityRoleName,
        SecurityRoleDescription,
        LastUpdatedGuid
    )
    OUTPUT
        INSERTED.SecurityRoleId
    INTO @roles
    SELECT
        SecurityRoleName,
        SecurityRoleDescription,
        NEWID()
    FROM @SecurityRole
    
    
    INSERT INTO dbo.SecurityRoleDtl (
        SecurityRoleId,
        MemberSecurityRoleId
    )
    SELECT
        1,
        SecurityRoleId
    FROM @roles
    

    【讨论】:

    • 这只是将编写 sql 查询以创建/删除临时表的工作与编写自定义存储过程来完成提升工作进行交换,这实际上是 IMO 的更多工作。
    • 您不必编写存储过程来执行此操作。如果需要,您甚至可以使用临时表来代替表变量。这为您提供了一种更清洁的方式来做您现在正在做的事情。
    • 我不同意这更清洁我实际上觉得这实际上是更多的工作,因为必须为它编写所有的 sql。在哪里获取我的表的创建语句来更改它,使其名称中包含 Temp 并删除其上的所有约束并使用 SSIS 将数据泵入和泵出它所需的工作比这要少得多,因为您需要为每个表编写这些 sql 语句单个实例这会发生。但这一切都归结为愚蠢的是,SSIS 没有约定使用 new sequenceid() 作为您可以作为派生列放置的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多