2011-11-21 20 views
1

編輯:事實證明,問題是輸入parm。顯然,如果你有一個INT類型的輸入參數,默認值爲NULL(即@MaxSeqKey int = NULL),並且你在WHERE子句中使用該參數,它可能會導致「掛起」問題。真正奇怪的是,它已經運行了好幾個月,並且在SP3應用時突然崩潰。由於這是批處理作業的一部分,因爲它已轉移到prod中,所以我們還沒有在測試中運行它。我們的測試服務器上也有SP3,所以我在發佈這個問題後在測試中運行它。看哪!它在測試中工作正常。去搞清楚。我們的DBA找到的工作是在proc中聲明一個內部INT變量,並設置內部變量等於parm。再次,去圖。隨你。它的工作原理是我想與社區分享。SQL 2008 SP3是否爲其他人打破了INSERT HASHBYTES? (原來是INT parm的問題)

SQL 10.0.5500(2008 SP3,NOT 2008R2)

我們揭開序幕一個存儲過程批處理作業。存儲的proc中有以下TSQL。

BEGIN TRANSACTION 
    UPDATE h 
    SET h.PreviousHash = h.CurrentHash 
    ,h.CurrentHash = HASHBYTES('SHA1', ISNULL(m.[Name],'') + ISNULL(m.[Address],'') + ISNULL(m.[City],'') + ISNULL(m.[State],'') + ISNULL(m.[Zip],'')) 
    FROM [Hash] h 
    INNER JOIN m WITH(NOLOCK) ON m.SequenceKey = h.SequenceKey 
    WHERE h.SequenceKey <= @MaxSeqKey 


    INSERT INTO [Hash] (SequenceKey, CurrentHash, PreviousHash, Name, [Address], City, Zip) 
    SELECT m.SequenceKey 
     ,HASHBYTES('SHA1', ISNULL(m.[Name],'') + ISNULL(m.[Address],'') + ISNULL(m.[City],'') + ISNULL(m.[State],'') + ISNULL(m.[Zip],'')) 
     ,NULL --PreviousHash - this indicates a "new" record 
     ,m.Name 
     ,m.[Address] 
     ,m.City 
     ,m.Zip 
    FROM Merchants m WITH(NOLOCK) 
    LEFT JOIN [Hash] h ON h.SequenceKey = m.SequenceKey 
    WHERE h.SequenceKey IS NULL 
    AND m.SequenceKey <= @MaxSeqKey 

COMMIT TRANSACTION 

這是proc的第一部分。這個每晚都運行良好,直到他們在上週末安裝了SQL 2008 SP3。起初,我們認爲UPDATE和INSERT到同一個表是問題所在,但我們註釋了UPDATE語句,它仍然被掛起(它不會崩潰,它只是掛起)。我們自己運行INSERT語句,它運行良好。在存儲過程中運行似乎只是一個問題。由於我們在整個系統中存儲過程中還有其他類似的聲明,只是不使用HASHBYTES函數,所以我們只能假設這是問題所在。如果有人願意花時間看看他們是否可以複製這一點,我將不勝感激。

+1

我懷疑你可能遇到參數嗅探或統計問題,而與'hashbytes','sp3'或默認值無關。 –

回答

0

參見我的上面編輯。 HASHBYTES不是問題。即使在設置值之後,輸入的缺省值爲NULL的INT類型的parm也是問題。

相關問題