2011-08-01 24 views
2

在我的sql服務器表中,我想添加一個計算列,它是同一個表中其他列的哈希值。以下是我的表格結構。在計算列中使用master.sys.fn_varbintohexsubstring

地址:
AddressID(INT,PK)
AddressLine1(NVARCHAR)
AddressLine2(NVARCHAR)
市(NVARCHAR)
國家(NVARCHAR)
AddressHash(計算列)

下面是我想要在我的計算列:

如果我用鼠標右鍵單擊表,去設計和輸入上面的「公式」,「計算列規範」下,我得到以下錯誤:

- 無法修改表。
在此上下文中,用戶定義的函數名稱不能以數據庫名稱作爲前綴。

所以我想我會用一個用戶定義函數計算哈希和其映射UDF式。

下面是我使用創造UDF代碼:

CREATE FUNCTION udfHashAddress 
( 
    @pAddressLine1 nvarchar(50), @pAddressLine2 nvarchar(50), @pCity nvarchar(50), @pState nvarchar(50)) 
) 
RETURNS nvarchar(max) -- not sure what the correct size would be 
WITH SCHEMABINDING 
AS 
BEGIN 
    DECLARE @result nvarchar(max) 
    SELECT @result = MASTER.SYS.FN_VARBINTOHEXSUBSTRING(0, HASHBYTES('SHA1',COALESCE(@pAddressLine1, N'') + COALESCE(@pAddressLine2, N'') + COALESCE(@pCity, N'') + COALESCE(@pState, N'')), 1, 0) 
    RETURN @result 
END 
GO 

,但我得到了下面的錯誤與上面的代碼:

* 無法架構綁定函數「udfHashAddress」,因爲名稱' MASTER.SYS.FN_VARBINTOHEXSUBSTRING'對模式綁定無效。名稱必須是兩部分的格式和對象不能引用自身*

當我刪除了「主」數據庫前綴我得到這個錯誤:

* 無法架構綁定函數「udfHashAddress」,因爲它引用系統對象'SYS.FN_VARBINTOHEXSUBSTRING'。*

我在這裏丟失了什麼嗎?將不勝感激任何援助/指針。

+0

你需要它是一個字符串?你可以不使用varbinary(20)嗎?看看這個答案。 http://stackoverflow.com/questions/6807438/how-to-determine-whether-a-record-with-specific-image-data-type-already-exists-in/6809525#6809525它使用md5和varbinary(16 )。 –

回答

6

由於您使用SQL Server 2008中,你有沒有嘗試過簡單:

CONVERT(VARCHAR(MAX), HASHBYTES('SHA1','string'), 2); 

這將返回,而不是小寫字母大寫,但您可以修復與LOWER(),如果它是很重要的。

這裏是你的實際模式爲例(在tempdb中創建的目的):

USE tempdb; 
GO 

CREATE TABLE dbo.[Address] 
(
    AddressID INT PRIMARY KEY, 
    AddressLine1 NVARCHAR(64), 
    AddressLine2 NVARCHAR(64), 
    City NVARCHAR(64), 
    [State] NVARCHAR(64), 
    AddressHash AS LOWER(CONVERT(VARCHAR(4000), HASHBYTES('SHA1', 
     COALESCE(AddressLine1, N'') + COALESCE(AddressLine2, N'') 
     + COALESCE(City, N'') + COALESCE([State], N'')), 2)) 
     --PERSISTED -- you could also persist it if desired 
); 

INSERT dbo.[Address] 
    VALUES(1, 'foo', 'bar', 'blat', 'splunge'), 
      (2, 'bar', 'foo', 'blag', 'splmger'); 

SELECT *, master.dbo.fn_varbintohexsubstring 
    (0, 
     HASHBYTES 
     (
      'SHA1', 
      COALESCE(AddressLine1, N'') + COALESCE(AddressLine2, N'') 
      + COALESCE(City, N'') + COALESCE([State], N'') 
     ), 1, 0) 
     FROM dbo.[Address]; 
GO 

DROP TABLE dbo.[Address]; 
+2

PS你可以把它放在計算列定義中而不需要引用UDF ...但是盡一切可能避免使用右鍵單擊設計來修改表格。使用ALTER TABLE ...它遠沒有多少bug且不直觀。 –

+0

這將工作。謝謝。 – muruge