【问题标题】:Create Unique Column in SSIS在 SSIS 中创建唯一列
【发布时间】:2012-08-22 11:19:35
【问题描述】:

我有一个 SSIS 包,它接受一个表并查找大量其他列,最终得到如下数据集:

ItemID | ProductGroupCode | Product Code
1      |  AAAA            |
2      |  AAAA            |
3      |  BBBB            |
4      |  BBBB            |
5      |  CCCC            |

ItemID 是唯一的。我需要通过将 ProductGroupCode 连接到从 1700 开始的 4 位数字来创建唯一的 ProductCode。

所以数据看起来像:

ItemID | ProductGroupCode | Product Code
1      |  AAAA            | AAAA1000
2      |  AAAA            | AAAA1001
3      |  BBBB            | BBBB1000
4      |  BBBB            | BBBB1001
5      |  CCCC            | CCCC1000

但是,它还需要检查产品表中是否不存在产品代码。产品代码 AAAA1000 很有可能已经存在。如果是这种情况,那么它应该增加产品代码。

我可以用 SQL 中的游标来做到这一点,表“ProductImportHalfWay”是 SSIS 包中途的数据集

DECLARE @ProductCode VARCHAR(10),
        @CurrentProductCode VARCHAR(10),
        @ItemID INT,
        @ProductNumber INT

SELECT @ProductNumber = 0, @CurrentProductCode = ''

DECLARE productGroupCodes CURSOR FAST_FORWARD
FOR SELECT distinct ProductGroupCode, ItemID
FROM ProductImportHalfWay 
ORDER BY ProductGroupCode 

OPEN productGroupCodes
    FETCH NEXT FROM productGroupCodes INTO @ProductCode, @ItemID

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF @CurrentProductCode <> @ProductCode
        BEGIN
            SET @CurrentProductCode = @ProductCode
            SET @ProductNumber = 1699 --set to 1699 so that we can add 1 to get 1700
        END

        SET @ProductNumber = @ProductNumber + 1
        WHILE EXISTS (SELECT 1 FROM Product WHERE ProductCode = @ProductCode + CAST(@ProductNumber AS VARCHAR(4)))
        BEGIN
            SET @ProductNumber = @ProductNumber + 1
            --print 'increase'
        END     

        UPDATE ProductImportHalfWay
        SET ProductGroupCode = @ProductCode + CAST(@ProductNumber AS VARCHAR(4))
        WHERE ItemID = @ItemID

        FETCH NEXT FROM productGroupCodes
        INTO @ProductCode, @ItemID
    END
CLOSE productGroupCodes
DEALLOCATE productGroupCodes

但我不知道如何将它放在数据转换的中间(而且我真的不想输出“ProductImportHalfWay”表)


编辑:额外示例 如果数据库中已经存在ProductCode AAAA1000,那么导入的记录应该是这样的

ItemID | ProductGroupCode | Product Code
1      |  AAAA            | AAAA1001
2      |  AAAA            | AAAA1002
3      |  BBBB            | BBBB1000
4      |  BBBB            | BBBB1001
5      |  CCCC            | CCCC1000

【问题讨论】:

  • 所以你生成了 AAAA1000 和 AAAA1001 并且 AAAA1000 存在,AAAA1000 会变成什么? AAAA1002?变成AAAA9999有关系吗? BBBB1000 与 AAAA1000 共享相同的数字代码有什么问题吗?当你用完你的 4 位数号码池时会发生什么?简而言之,您能否进一步解释一下您生成产品代码的业务规则?
  • 添加了额外的示例,说明当 AAAA1000 已经存在时会发生什么。它应该只是增加到 AAAA1001。每个 ProductGroupCode 应该从 1000 开始,因此 AAAA1000 和 BBBB1000 应该共存。数字需要按顺序增加,所以不能直接跳到 AAAA9999。不会出现产品超过10000种的情况,不用担心4位数号码池用完
  • 基本上,产品代码由产品类型(例如 AAAA)和数字组成。 Item ID 是我们在数据库中用来指代产品的标识列,但业务使用产品代码(例如 AAAA1000)来指代产品。我们正在尝试导入大量新产品,需要创建符合规则的产品代码,但不要与任何现有产品代码冲突

标签: sql sql-server-2005 ssis


【解决方案1】:

到目前为止,我们想出的最好方法是进行数据转换以设置记录,将其保存到临时表中,运行我在问题中包含的 SQL,然后运行另一个从临时表中读取的数据转换完成导入

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多