編輯:事實證明,問題是輸入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函數,所以我們只能假設這是問題所在。如果有人願意花時間看看他們是否可以複製這一點,我將不勝感激。
我懷疑你可能遇到參數嗅探或統計問題,而與'hashbytes','sp3'或默認值無關。 –