【发布时间】:2020-11-03 01:56:41
【问题描述】:
我正在尝试编写一个查询,它会根据要求自动生成删除查询。我会从不同的表中删除数据并转储到临时表中,然后使用这个临时表我需要使用 IN 运算符编写查询,请建议我,这是我尝试过的。
SET NOCOUNT ON
DECLARE @DeleteDisbursement TABLE (DisbursementId BIGINT, PolicyNumber NVARCHAR(10),DisbursementAmount DECIMAL(19,4))
DECLARE @DeleteRecords Table(DisbursementId BIGINT,ActivityId BIGINT)
INSERT INTO @DeleteDisbursement (DisbursementId,PolicyNumber,DisbursementAmount)
VALUES
(4576,'12345',3.00),
(1232,'65455',143.44),
(2341,'34234',228.95),
(1111,'23155',414.89)
SELECT * from @DeleteDisbursement
DECLARE @GenerateScriptCount BIGINT =0
DECLARE @DisbursementIDValue BIGINT =0
DECLARE @ActivityIdValue BIGINT =0
WHILE EXISTS(SELECT Top 1 1 FROM @DeleteDisbursement)
BEGIN
DECLARE @DisbursementId BIGINT =0
DECLARE @PolicyNumber NVARCHAR(10)
DECLARE @AccountId BIGINT =0
DECLARE @ActivityId BIGINT
DECLARE @DisbursementAmount DECIMAL(19,4)
SELECT TOP 1 @DisbursementId =DisbursementId ,@PolicyNumber = PolicyNumber,@DisbursementAmount = DisbursementAmount
FROM @DeleteDisbursement
SET @ActivityId = (SELECT ActivityId FROM ActivityLog WHERE ActivityAmount = @DisbursementAmount)
IF (@ActivityId > 0)
BEGIN
INSERT INTO @DeleteRecords (DisbursementId,ActivityId) VALUES(@DisbursementId,@ActivityId)
END
DELETE FROM @DeleteDisbursement WHERE DisbursementId = @DisbursementId
END
WHILE EXISTS(SELECT Top 1 1 FROM @DeleteRecords)
BEGIN
SELECT TOP 1 @DisbursementIDValue= @DisbursementId,@ActivityIdValue = @ActivityId FROM @DeleteRecords
PRINT 'DELETE FROM Disbursement Where DisbursementId IN (' + CONVERT(NVARCHAR(MAX), @DisbursementIDValue) +')'
PRINT 'DELETE FROM ActivityLog WHERE ActivityId IN (' + CONVERT(NVARCHAR(MAX), @ActivityIdValue) +')'
DELETE FROM @DeleteRecords WHERE DisbursementId = @DisbursementId
END
SET NOCOUNT OFF;
但它不起作用,请帮助我如何编写查询仅包含在 IN 运算符中的 1 个查询,如下所示:-
DELETE FROM Disbursement Where DisbursementId IN (4576,1232,2341,1111)
DELETE FROM ActivityLog WHERE ActivityId IN (1000,2000,3000,4000)
【问题讨论】:
-
您是否有理由要逐行执行此操作,而不仅仅是单个语句?有点不清楚您的@tables 是否仅用于演示目的,或者它们是否是您实际工作中的硬表。
-
我想我正在努力实现 - 我已经创建了 Temp 表,在该表中我已经插入了我想要根据 INPUT 值删除的所有记录(输入可能是 1000 条记录或更多) .现在使用这个临时表我必须使用 IN 运算符动态生成删除查询,例如 (Delete * from table1 where disbId IN(1,2,3,4,5,6 etc until 1000 rows)) ,这基本上是出于性能目的,我可以使用 = like (Delete * from table1 where disbId =1, Delete * from table1 where disbId =2 etc..) 来实现,但是它在 Prod 中需要很长时间,所以我必须只使用 IN跨度>
-
所以我的查询将只是手动执行打印操作,因此我将复制打印生成的查询并将放置到生产中以用于删除目的
-
请建议我如何在上述条件下进行 PRINT,我需要使用 IN 运算符打印所有需要删除的值,例如 PRINT ' DELETE FROM Disbursement Where DisbursementId IN (DisbursementIDValue)'
标签: sql .net sql-server