將輸入字串轉換為 32 位元整數陣列(Word Array),為 MD5 主運算準備資料區塊。
IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_ConvertToWordArray]') AND xtype IN(N'FN', N'IF', N'TF')) DROP FUNCTION [dbo].[MD5_ConvertToWordArray] GO CREATE FUNCTION dbo.MD5_ConvertToWordArray( @sOrigMess VARCHAR(8000) = '' ) RETURNS @tWordArray TABLE([ID] INT IDENTITY(0,1), [Word] INT) WITH ENCRYPTION AS BEGIN IF @sOrigMess IS NULL SET @sOrigMess = '' DECLARE @iLenOfMess INT, @iWordArrayLen INT, @iPosOfWord INT DECLARE @iPosOfMess INT, @iCountOfWord INT SET @iLenOfMess = LEN(@sOrigMess) SET @iWordArrayLen = ((@iLenOfMess + 8) / 64 + 1) * 16 SET @iCountOfWord = 0 -- 初始化陣列為 0 WHILE(@iCountOfWord < @iWordArrayLen) BEGIN INSERT INTO @tWordArray([Word]) VALUES(0) SET @iCountOfWord = @iCountOfWord + 1 END -- 將字元編碼填入陣列(小端序) SELECT @iPosOfMess = 0, @iPosOfWord = 0, @iCountOfWord = 0 WHILE(@iPosOfMess < @iLenOfMess) BEGIN SELECT @iCountOfWord = @iPosOfMess / 4, @iPosOfWord = @iPosOfMess % 4 UPDATE @tWordArray SET [Word] = [Word] | dbo.MD5_LShift(UNICODE(SUBSTRING(@sOrigMess,@iPosOfMess+1,1)), @iPosOfWord*8) WHERE [ID] = @iCountOfWord SET @iPosOfMess = @iPosOfMess + 1 END -- 附加填充位元:0x80 (10000000) SELECT @iCountOfWord = @iPosOfMess / 4, @iPosOfWord = @iPosOfMess % 4 UPDATE @tWordArray SET [Word] = [Word] | dbo.MD5_LShift(0x80, @iPosOfWord*8) WHERE [ID] = @iCountOfWord -- 附加原始訊息長度(位元數),低 32 位與高 32 位 UPDATE @tWordArray SET [Word] = [Word] | dbo.MD5_LShift(@iLenOfMess, 3) WHERE [ID] = @iWordArrayLen - 2 UPDATE @tWordArray SET [Word] = [Word] | dbo.MD5_RShift(@iLenOfMess, 29) WHERE [ID] = @iWordArrayLen - 1 RETURN END GO
((長度+8)/64+1)*16
位置%4 * 8
MD5_LShift
MD5_RShift
儲存常用伺服器連線,避免重複輸入 步驟 1:註冊目前連線的
適用場景 異構數據源互導:Excel ↔ SQL Se
複寫監視器是 DBA 定位複寫錯誤、監控代理程式健康狀態的核
前情提要 承接第一部分,已建立 MyDataBase、MyT