根据要求,编辑以提供更多详细信息
我有一个存储过程(让我们称之为spOuter
)沿着以下几行:
ALTER PROCEDURE [dbo].[spOuter]
(@SelFromDateUTC smalldatetime
,@SelToDateUTC smalldatetime
,@SelDriverId int = null
) AS
DECLARE @SelDriverName varchar(40)
Set Nocount on
exec dbo.spInner --<<<<<<<<<<<<<<<<<<<<<<<<<<<
Select @SelDriverName = DriverName
From dbo.tblDrivers
Where DriverID = @SelDriverId
Set Nocount off
Select @SelToDateUTC as @SelShiftDateUTC
,@SelDriverName as SelDriverName
, *
From dbo.vwRptDriverProgress
Where ActionTimeUTC between @SelFromDateUTC and @SelToDateUTC
and DriverId = coalesce(@SelDriverId, DriverId)
Order by DriverName,ActionTimeUTC,DriverLogId
当我从SSMS运行spInner
时,它不会返回任何结果集。
但是,当我从spOuter
运行时,我会得到两个结果集,一个来自spInner
,另一个来自spOuter
(注释掉spInner
的调用会删除多余的结果集) 。
spInner
如下:
ALTER PROCEDURE [dbo].[spInner] AS
set nocount on
Declare @CutoffDate smalldatetime
Set @CutoffDate = DateAdd(Month, -1, getUTCDate()) -- no need to keep reprocessing the whole table.
if @CutoffDate < '11/1/2008'
Set @CutoffDate = '11/1/2008'
Insert dbo.tblADIShifts (PU.DriverId, PU.PunchInTimeUTC, PU.PunchInLocationId)
Select DriverId, PunchInTimeUTC, PunchInLocationId
From vwUpdDriverLogsAddShifts PU -- Distinct Driver,PunchInTimeUTC combinations.
Where PU.PunchInTimeUTC > @CutoffDate
and not exists (Select *
from dbo.tblADIShifts SH
Where SH.DriverId=PU.DriverId
and SH.PunchInTimeUTc = PU.PunchInTimeUtC)
Order By PU.DriverId, PU.PunchInTimeUTC
Update dbo.tblADIShifts Set
PunchOutTimeUTC = PU.PunchOutTimeUTC
,PunchOutLocationId = PU.PunchOutLocationId
From vwUpdDriverLogsNewPunchOuts PU
Where dbo.tblADIShifts.ShiftId = PU.ShiftId and PU.PunchInTimeUTC > @CutoffDate
Insert dbo.tblDriverLogs (DriverId, ActionId, ActionTimeUTC, ShiftId, LocationId)
Select DriverId, ActionId, PunchInTimeUTC, ShiftId, PunchInLocationId
From dbo.vwUPDDriverLogsSP
Insert dbo.tblDriverLogs (DriverId, ActionId, ActionTimeUTC, ShiftId, LocationId)
Select DriverId, ActionId, PunchOutTimeUTC, ShiftId, PunchOutLocationId
From dbo.vwUPDDriverLogsFP
Update dbo.tblDriverLogs Set
ShiftId = SH.ShiftId
From dbo.vwUpdDriverLogsAssignShifts SH
Where SH.PunchInTimeUTC > @CutoffDate
and dbo.tblDriverLogs.DriverLogId = SH.DriverLogId
Update dbo.tblDriverLogs Set
ShiftId = PrevShiftId
From dbo.vwUpdDriverLogsShiftless3 SH
Where dbo.tblDriverLogs.DriverLogId = SH.DriverLogId
--<<<<<<<<< The bogus (and empty) result set has the columns
--<<<<<<<<< of tblMovementLocations which is only referenced here:
Update dbo.tblMovementLocations Set
Distance = CalcDistance
From vwExcessiveOrderDistances vw
Where dbo.tblMovementLocations.MovementLocationId = vw.MovementLocationId
Update dbo.tblDriverLogs Set
DriveTimeMinutes = VW.DriveTimeMinutes
,BreakTimeMinutes = VW.BreakTimeMinutes
,DelayTimeMinutes = VW.DelayTimeMinutes
,LocationId = VW.LocationId
From dbo.vwUpdDriverLogs VW
Where dbo.tblDriverLogs.DriverLogId = VW.DriverLogId
and VW.ActionTimeUTC > @CutoffDate
and (dbo.tblDriverLogs.DriveTimeMinutes <> VW.DriveTimeMinutes
or dbo.tblDriverLogs.BreakTimeMinutes <> VW.BreakTimeMinutes
or dbo.tblDriverLogs.DelayTimeMinutes <> VW.DelayTimeMinutes
or coalesce(dbo.tblDriverLogs.LocationId,-1) <> VW.LocationId)
当然,这些选择是插入/更新语句的一部分,不应返回结果集? 有没有办法解决这个问题?
SQLServer 2005 SP2版本9.00.4035.00
答案 0 :(得分:1)
或许更改spInner
中更新语句的语法以使用alias(请参阅Good way to use table alias in Update statement?)和JOIN
可能会改变行为 - 类似于这个,例如:
UPDATE [locations]
SET Distance = CalcDistance
FROM dbo.tblMovementLocations AS [locations]
INNER JOIN vwExcessiveOrderDistances AS [vw]
ON [locations].MovementLocationId = [vw].MovementLocationId;
思考过程可能在vwExcessiveOrderDistances
中可能没有任何相应的记录与dbo.tblMovementLocations
匹配,这可能导致数据库引擎返回空结果集将语句视为SELECT
上的dbo.tblMovementLocations
语句。如果是这样的话肯定会很奇怪!
这只是我的猜测......