2016-08-19 86 views
1

我的任务是自动执行一些操作(删除数据库中的旧行),现在这些操作都是手动完成的。 目前我有两个MSSQL脚本。 第一个提取ID,我必须处理,以及为每个ID删除多个行。它看起来像这样:如何合并两个SQL脚本?

​​

所以,当我收到的所有ID我有,我启动第二个脚本,每ID(手动更改脚本中的数量和relunching它的每一行工作从第一个选择):

Declare @counter INT 
Declare @fdel INT 
Declare @csize INT 
Declare @batchId INT 

select @batchId=666777 --HERE IS AN ID I CHANGE MANUALLY AND RELAUNCH THE SECOND ONE SCRIPT FOR IT 
select @csize=500 
select @counter = 0 
select @fdel=count(*) from dbo.Logs where batchId = @batchId 

While (@counter < @fdel) 
BEGIN 
select @counter = @counter + @csize 
BEGIN TRAN 
DELETE top(@csize) from dbo.Logs where batchId = @batchId 
COMMIT TRAN 
END 

那么,如何将这些脚本合并为一个脚本来启动整个脚本?

回答

1

你几乎完成CURSOR声明。在没有讨论解决方案本身的情况下,带有“合并”查询的代码将如下所示:

/* your declared variables and cursor variable */ 
DECLARE 
    @crBatches CURSOR, 
    @counter INT, 
    @fdel INT, 
    @csize INT = 500, 
    @batchId INT 

/* your first query declared as cursor/source for looping through batch_ids */ 
SET @crBatches = CURSOR FAST_FORWARD FOR 
SELECT e.batchId, count (*) "Count" 
FROM dbo.[Logs] e 
join [dbo.[Batch] b on b.Id = e.batchId 
Group by e.batchId, b.Name 
Having count(*) > 500 
order by [Count] 

OPEN @crBatches 

FETCH NEXT FROM @crBatches 
INTO @batchId, @fdel 

/* loop on batch_ids obtained from cursor */ 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @counter = 0 

    /* internal loop - your second query */ 
    While (@counter < @fdel) 
    BEGIN 
     SET @counter = @counter + @csize 

     BEGIN TRAN 
     DELETE top(@csize) from dbo.Logs where batchId = @batchId 
     COMMIT TRAN 
    END 

    FETCH NEXT FROM @crBatches 
    INTO @batchId, @fdel 
END 

CLOSE @crBatches 
DEALLOCATE @crBatches 
1

您可以使用子查询和其中

delete from dbo.Logs 
where id in ( select id_to_del from 
    (SELECT e.batchId as id_to_del, b.Name, count (*) "Count" 
     FROM dbo.[Logs] e 
     join [dbo.[Batch] b on b.Id = e.batchId 
     Group by e.batchId, b.Name 
     Having count(*) > 500 
     order by [Count]));