2010-05-21 72 views
0

我遇到了T-SQL與SQL2008(與SQL2000)的差異,這些差異導致我陷入死衚衕。我已經驗證了在創建#TEMP的調用程序和引用它的子sProc之間共享#TEMP表的技術在SQL2008 See recent SO question中仍然有效。爲什麼SQL2008調試器不會進入某個子存儲過程

我的核心問題仍然是一個關鍵的「子」存儲過程,在SQL2000中正常工作,但在SQL2008中失敗(即,子sProc中的FROM子句編碼爲:SELECT * FROM #AREAS A),儘管正在創建#AREAS主叫父母。現在不是發佈代碼片段,而是另一個可能有助於您提出建議的症狀。

我解僱了在SQL管理Studio中的調試器:

EXEC dbo.AMS1 @S1='06',@C1='037',@StartDate='01/01/2008',@EndDate='07/31/2008',@Type=1,@ACReq = 1,@Output = 0,@NumofLines = 30,@SourceTable = 'P',@LoanPurposeCatg='P' 

這是一個非常大的存儲過程和關鍵片段是奇怪的是:

create table #Areas 
( 
    State  char(2)    
, County char(3)    
, ZipCode char(5)   NULL     
, CityName varchar(28)  NULL 
, PData  varchar(3)  NULL 
, RData  varchar(3)  NULL 
, SMSA_CD varchar(10)  NULL 
, TypeCounty varchar(50) 
, StateAbbr char(2) 
) 
EXECUTE dbo.AMS_I_GetAreasV5  -- this child populates #Areas 
    @SMSA = @SMSA 
, @S1 = @S1  
, @C1 = @C1  
, @Z1 = @Z1  
, @SourceTable = @SourceTable 
, @CustomID = @CustomID 
, @UserName = @UserName 
, @CityName = @CityName 
, @Debug=0 
EXECUTE dbo.AMS_I_GetAreas_FixAC -- this child cannot reference #Areas (in 2008 only!) 
    @StartDate = @StartDate  -- secondarily, I cannot STEP INTO this sProc 
, @EndDate = @EndDate 
, @SMSA_CD = @SMSA_CD 
, @S1 = @S1 
, @C1 = @C1 
, @Z1 = @Z1 
, @CityName = @CityName 
, @CustomID = @CustomID 
, @Debug=0 
-- continuation of the parent sProc** 

我可以逐步父存儲過程的執行。當我到達上面的第一個孩子的時候,我可以選擇dbo.AMS_I_GetAreasV5或者在其執行過程中執行。當我到達第二個孩子sProc - dbo.AMS_I_GetAreas_FixAC的調用時 - 我試着步入它(因爲那是問題陳述的地方),並且STEP INTO被忽略(即,像STEP OVER那樣對待;但是我知道我按了F11而不是F10)。但是,它已執行,因爲在EXECUTE後控制返回到語句時,單擊繼續以完成執行,並且結果窗口顯示dbo.AMS_I_GetAreas_FixAC(即第二個子)存儲過程中的錯誤。

有沒有一種方法來「預加載」一個sProc,目的是在其條目上設置一個斷點,以便我可以在其中執行執行?

總之,我不知道是否無法進入給定的子進程,可能與此特定子進程無法引用由它的父進程創建的#temp(調用者)相同。

回答

0

我發現的被稱爲存儲過程(即兒童),一個顯然有

SET NOCOUNT OFF 

對於一些長期被遺忘的原因。

顯然,SQL 2008中事物的行爲在生效時是完全不同的。

我結束了識別所有存儲過程類似於上述的所有行,它們改變到

SET NOCOUNT ON 

..和也,我在實例級別檢查NOCOUNT。這解決了這些非常奇怪的問題。

相關問題