Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否使用外键依赖项批量创建行?_Sql Server_Tsql - Fatal编程技术网

Sql server 是否使用外键依赖项批量创建行?

Sql server 是否使用外键依赖项批量创建行?,sql-server,tsql,Sql Server,Tsql,我编写了一些用于更新单个客户的SQL语句。当这个代码被推出时,我必须更新所有的客户 现在客户ID是硬编码的,SQL语句基于该ID插入一条记录。Prototype可以工作,现在我想使用相同的算法为所有客户插入10000条记录 DECLARE @customerID BIGINT = 47636; DECLARE @limitFourAdjustment MONEY; DECLARE @appliesToDateTime DATETIME2(7) = SYSUTCDATETIME(); DECLA

我编写了一些用于更新单个客户的SQL语句。当这个代码被推出时,我必须更新所有的客户

现在客户ID是硬编码的,SQL语句基于该ID插入一条记录。Prototype可以工作,现在我想使用相同的算法为所有客户插入10000条记录

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,而不是每次都是唯一的

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语句(第一个代码块)?

使用数据库的关键是让您的头脑围绕基于集合的操作,而不是过程性操作。数据库被设计为一次对一组数据进行自然操作,但您必须将对问题的思考方式改为一次操作整个数据集,而不是一次操作一条记录

下面是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
请注意,
插入
可以直接与
选择
组合,而不是使用