【发布时间】:2021-01-24 12:15:13
【问题描述】:
我有一个包,其中包含一个 Foreach 循环,在它里面我有任务运行程序执行,它执行一个没有 Order by 或索引的查询 我在里面执行的代码是:
declare @Sdate int
set @Sdate=?
declare @Edate int
set @Edate=?
---------------ActiveShowingType-------
update att.FactWorkPeriod
set ActiveShowingType=0
update w
set w.ActiveShowingType=case when w.ShowingTypeId=c.ShowingTypeID then 1
else 0 end
from att.FactWorkPeriod w
inner join att.DimCode c on w.CodeId=c.[CodeId]
where w.DateSK between @Sdate and @Edate
---------------------- HasContract-------------------
declare @YearStart char(4)=(select min (YearIR) from att.FactWorkPeriod w
inner join gnr.DimDate d on w.DateSK=d.DateSK)
update w1
set w1.HasContract =case when t.PersonSK is not null then 1 else 0 end
from att.FactWorkPeriod w1
inner join (
select distinct
(select max(datesk) from gnr.dimdate dd where dd.yearmonthIR=d.YearMonthIR)as dateSK,
p.PersonSK
from gnr.DimDate d
left join att.DimPerson p on d.FullDateIR between p.EmployDate and p.ExitDate
where YearIR between @YearStart and (select YearIR from gnr.DimDate where IsToday=1) and d.LastDayOfMonth=1
)t on t.dateSK=w1.DateSK and t.PersonSK=w1.PersonSK
where w1.DateSK between @Sdate and @Edate
--------------------ContractTypeId------------------
if (case when (select Count(isnull(GroupId ,0)) from kasrawarehouse.att.DimGroup)<1 then 0 else 1 end= 1 )
begin
update w2
set w2.ContractTypeId=t.ContractTypeId
from att.FactWorkPeriod w2
inner join ( select w3.DateSK , w3.PersonSK , case when gp.groupid is not null then 0
else 1 end as ContractTypeId from att.FactWorkPeriod w3
inner join att.DimPerson p on w3.PersonSK=p.PersonSK
inner join gnr.DimDate d on d.DateSK=w3.DateSK
left join KasraForWarehouseConvert.gnr.GroupPerson gp
ON d.FullDateIR BETWEEN gp.SDate COLLATE Arabic_CI_AS AND gp.EDate COLLATE Arabic_CI_AS
and gp.PersonelID=p.PersonBK
and gp.GroupID in (select distinct GroupId from [Att].[DimGroup])--='15027'
where d.LastDayOfMonth=1 )t on t.DateSK=w2.DateSK and t.PersonSK=w2.PersonSK
where w2.DateSK between @Sdate and @Edate
end
--------------- به روز رسانی واحد سازمانی که از بین رفته ------
update w4
set w4.OrgSK='999999999'
from att.FactWorkPeriod w4
inner join (select distinct OrgSK from att.FactWorkPeriod w5
where w5.OrgSK not in (select distinct OrgIdPreffix from att.DimOrg)) t on t.OrgSK=w4.OrgSK
where w4.DateSK between @Sdate and @Edate
-------- پاک کردن افرادی که پاک شده اند -------
delete from att.FactWorkPeriod
where PersonSK not in (select distinct PersonSK from att.DimPerson)
and DateSK between @Sdate and @Edate
并且在执行期间 tempDb 快速增长并在驱动器已满时停止。我如何执行它而不将它存储在 tempDb 上并且只插入和更新数据? PS-我在 Sql Server 中运行代码,它可以正常工作。
【问题讨论】:
-
如果您的存储设备要填充多小,或者您尝试在一次事务中处理多少数据?您不能使用
tempdb停止 SQL Server,如果它觉得需要使用它,用于创建工作表之类的东西,它会使用它。
标签: sql sql-server visual-studio ssis