如何批量创建具有外键依赖性的行?

时间:2019-01-01 21:33:43

标签: sql-server tsql

我写了一些可用于更新单个客户的SQL语句。推出此代码后,我必须更新所有客户。

现在,客户ID已被硬编码,并且SQL语句基于该ID插入一条记录。原型有效,现在我想使用相同的算法为所有客户提供10,000个插入内容。

DECLARE @customerID BIGINT = 47636;
DECLARE @limitFourAdjustment MONEY;
DECLARE @appliesToDateTime DATETIME2(7) = SYSUTCDATETIME();

DECLARE @dp_y INT = DATEPART(YEAR, @appliesToDateTime);
DECLARE @dp_m INT = DATEPART(MONTH, @appliesToDateTime);
DECLARE @dp_w INT = DATEPART(WEEK, @appliesToDateTime);
DECLARE @dp_d INT = DATEPART(DAY, @appliesToDateTime);
DECLARE @dp_h INT = DATEPART(HOUR, @appliesToDateTime);
DECLARE @d_h DATETIME2(7) = DATEADD(HOUR, DATEDIFF(HOUR, 0, @appliesToDateTime), 0);

SELECT
    @limitFourAdjustment = -COALESCE(SUM(COALESCE(Amount, 0)), 0)
FROM 
    [dbo].Transactions
WHERE
    CustomerID = @customerID AND
    IsSystemVoid = 0 AND
    TransactionTypeID IN (SELECT ID FROM TransactionTypes WHERE TransactionTypeGroupID = 3)

INSERT INTO dbo.CustomerAccounts_TransactionSummation (CustomerID, LimitTypeID, Y, M, W, D, H, YMDH, Amount)
VALUES (@customerID, 4, @dp_y, @dp_m, @dp_w, @dp_d, @dp_h, @d_h, @limitFourAdjustment);

我尝试添加一个while循环,似乎不是最快的解决方案。也许首先收集ID,然后通过循环将其馈入?我在下面的第一次尝试不起作用,因为我只是获得了最后一个客户ID,而不是每次都获得一个唯一的ID。

SELECT @numberOfCustomers = COUNT(*) 
FROM  dbo.Customers

WHILE(@numberOfCustomers > 0)
BEGIN
    SELECT @customerID = ID FROM dbo.Customers

    OTHER LOGIC FROM ABOVE

    SET @numberOfCustomers = @numberOfCustomers - 1;
END

问题是,如何在每个客户的ID上运行这些SQL语句(第一个代码块)?

1 个答案:

答案 0 :(得分:1)

使用数据库的关键是让您了解基于集合的操作,而不是过程操作。数据库被设计为一次自然地对一组数据进行操作,但是您必须将对问题的思考方式改为在一次操作整个数据集而不是一次记录的情况下。

下面是我想一口气完成您的完整更新的SQL:

INSERT INTO dbo.CustomerAccounts_TransactionSummation (CustomerID, LimitTypeID, Y, M, W, D, H, YMDH, Amount)
  SELECT
    id
    , 4 
    , @dp_y
    , @dp_m
    , @dp_w
    , @dp_d
    , @dp_h
    , @d_h
    , -COALESCE(SUM(COALESCE(Amount, 0)), 0) limitFourAdjustment
  FROM [dbo].Transactions
  WHERE IsSystemVoid = 0
  and TransactionTypeID IN (SELECT ID FROM TransactionTypes WHERE TransactionTypeGroupID = 3)
  --and CustomerID = @customerID

请注意,与使用insert相比,select可以直接与values组合。