5

要求に応じて、詳細を提供するために編集

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と、結果セットが返されません。ただし、から実行すると、spOuter2つの結果セットが得られます。1つはfromspInnerで、もう1つはfromです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)

確かに、これらの選択は挿入/更新ステートメントの一部であり、結果セットを返すべきではありませんか?これを回避する方法はありますか?

SQLServer2005SP2バージョン9.00.4035.00

4

1 に答える 1

1

おそらく、エイリアスを使用するように更新ステートメントの構文を変更すると(spInnerUpdateステートメントでテーブルエイリアスを使用する良い方法を参照)、動作が変更される可能性があります。たとえば、次のようになります。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。これが事実であるならば、それは確かに奇妙でしょう!

これは私の推測ですが...

于 2013-01-03T16:48:29.923 に答える