2011-08-01 6 views
2

SQL Server 테이블에서 동일한 테이블의 다른 열을 해시하는 계산 된 열을 추가하려고합니다. 아래 테이블 구조입니다.계산 된 열에서 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 '은 (는) 스키마 바인딩에 유효하지 않습니다. 이름은 두 부분으로 형식이어야하고 객체 자체를 참조 할 수 없습니다 *

나는이 오류가 발생했습니다 "마스터"DB 접두사를 제거 할 때 :.

* 수 없습니다 스키마 바인딩 기능 'udfHashAddress'그것 때문에 시스템 개체 'SYS.FN_VARBINTOHEXSUBSTRING'을 참조하십시오. *

여기에 뭔가가 있습니까? 어떤 도움이나 조언을 부탁드립니다.

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

이 대신 소문자로 대문자를 반환합니다,하지만 당신은 해결할 수를 가진 것이 중요 경우() LOWER :

+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을 사용하고 있기 때문에, 당신은 단순히 노력했다. 여기

은 (목적에 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

추신 : UDF를 참조하지 않고 계산 된 열 정의에 넣을 수 있습니다 ...그러나 마우스 오른쪽 버튼으로 클릭 한 디자인을 사용하여 테이블을 수정하지 않도록 할 수있는 모든 작업을 수행하십시오. ALTER TABLE을 사용하십시오 ... 버그가 적고 직관적이지 않습니다. –

+0

그게 효과가있다. 감사. – muruge

관련 문제