批量插入而不是游标
Bulk insert instead of cursor
我们有这样的结构:
Deposit
PrimaryKey depositId
Depositofficerid
1-> M Depositworker
ForeignKey depositId
WorkerId
WorkerRoleGroupId = 1
对于Deposit
table中的每个Depositofficerid
,Depositworker
table中应该有一条记录workerid = Depositofficerid
。
这就是我使用 cursor
完成的方法。我想知道是否有办法批量插入 Depositworker
table。
IF OBJECT_ID('tempdb..#tempdeposits') IS NOT NULL
DROP TABLE dbo.#tempdeposits;
CREATE TABLE #tempdeposits (
DepositId int
)
INSERT INTO #tempdeposits (DepositId)
SELECT
DepositId
FROM Deposit
WHERE
CreatedDate = '2005-01-14 16:05:51.920'
DECLARE @DepositId int
DECLARE @getloans CURSOR
SET @getloans = CURSOR FOR
SELECT
DepositId
FROM #tempdeposits
OPEN @getdeposits
FETCH NEXT FROM @getdeposits INTO @DepositId
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS (SELECT
Depositworkerid
FROM Depositworker
WHERE DepositId = @DepositId
AND WorkerRoleGroupId = 1)
BEGIN
PRINT @DepositId
INSERT INTO DepositWorker (DepositId, WorkerId, WorkerRoleGroupId, CreatedBy, CreatedDate, UpdateCounter)
SELECT
@DepositId,
Depositofficerid,
1,
1,
GETDATE(),
1
FROM Deposit
WHERE
DepositId = @DepositId
END
FETCH NEXT
FROM @getdeposits INTO @DepositId
END
CLOSE @getdeposits
DEALLOCATE @getdeposits
能否以某种方式帮助我将其变成批量插入而不是 cursor
?
是的,您可以使用相关 NOT EXISTS
:
以基于集合的方式执行此操作
INSERT INTO DepositWorker (DepositId, WorkerId, WorkerRoleGroupId, CreatedBy, CreatedDate, UpdateCounter)
SELECT
d.DepositId,
d.Depositofficerid,
1,
1,
GETDATE(),
1
FROM Deposit d
WHERE
CreatedDate = '2005-01-14 16:05:51.920'
AND NOT EXISTS(
SELECT 1
FROM DepositWorker dw
WHERE
dw.DepositId = d.DepositId
AND dw.WorkerRoleGroupId = 1
)
我们有这样的结构:
Deposit
PrimaryKey depositId
Depositofficerid
1-> M Depositworker
ForeignKey depositId
WorkerId
WorkerRoleGroupId = 1
对于Deposit
table中的每个Depositofficerid
,Depositworker
table中应该有一条记录workerid = Depositofficerid
。
这就是我使用 cursor
完成的方法。我想知道是否有办法批量插入 Depositworker
table。
IF OBJECT_ID('tempdb..#tempdeposits') IS NOT NULL
DROP TABLE dbo.#tempdeposits;
CREATE TABLE #tempdeposits (
DepositId int
)
INSERT INTO #tempdeposits (DepositId)
SELECT
DepositId
FROM Deposit
WHERE
CreatedDate = '2005-01-14 16:05:51.920'
DECLARE @DepositId int
DECLARE @getloans CURSOR
SET @getloans = CURSOR FOR
SELECT
DepositId
FROM #tempdeposits
OPEN @getdeposits
FETCH NEXT FROM @getdeposits INTO @DepositId
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS (SELECT
Depositworkerid
FROM Depositworker
WHERE DepositId = @DepositId
AND WorkerRoleGroupId = 1)
BEGIN
PRINT @DepositId
INSERT INTO DepositWorker (DepositId, WorkerId, WorkerRoleGroupId, CreatedBy, CreatedDate, UpdateCounter)
SELECT
@DepositId,
Depositofficerid,
1,
1,
GETDATE(),
1
FROM Deposit
WHERE
DepositId = @DepositId
END
FETCH NEXT
FROM @getdeposits INTO @DepositId
END
CLOSE @getdeposits
DEALLOCATE @getdeposits
能否以某种方式帮助我将其变成批量插入而不是 cursor
?
是的,您可以使用相关 NOT EXISTS
:
INSERT INTO DepositWorker (DepositId, WorkerId, WorkerRoleGroupId, CreatedBy, CreatedDate, UpdateCounter)
SELECT
d.DepositId,
d.Depositofficerid,
1,
1,
GETDATE(),
1
FROM Deposit d
WHERE
CreatedDate = '2005-01-14 16:05:51.920'
AND NOT EXISTS(
SELECT 1
FROM DepositWorker dw
WHERE
dw.DepositId = d.DepositId
AND dw.WorkerRoleGroupId = 1
)