2011-08-01 83 views
2

私のSQL Serverテーブルでは、同じテーブルの他の列のハッシュである計算列を追加します。以下は私のテーブル構造です。計算された列にmaster.sys.fn_varbintohexsubstringを使用します。

住所:
あるAddressId(int型、PK)
住所1(nvarchar型)
住所2(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 'はスキーマバインドには無効です。名前は二部形式でなければなりませんし、オブジェクト自体を参照することはできません*

私はこのエラーを得た「MASTER」デシベルプレフィックスを削除する場合:。

* ことができないスキーマバインド関数「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を使用してください...バグが少なく直感的です。 –

+0

それは動作します。ありがとう。 – muruge

関連する問題