Использовать master.sys.fn_varbintohexsubstring в вычисляемом столбце - PullRequest
2 голосов
/ 01 августа 2011

В моей таблице sql server я хочу добавить вычисляемый столбец, который является хешем других столбцов в той же таблице.Ниже приведена структура моей таблицы.

Адрес:
AddressID (int, PK)
AddressLine1 (nvarchar)
AddressLine2 (nvarchar)
Город (nvarchar)
State (nvarchar)
AddressHash (вычисляемый столбец)

Ниже приведено то, что я хочу получить в моем вычисляемом столбце:

MASTER.SYS.FN_VARBINTOHEXSUBSTRING(0, HASHBYTES('SHA1',COALESCE(AddressLine1, N'') + COALESCE(AddressLine2, N'') + COALESCE(City, N'') + COALESCE(State, N'')), 1, 0)

Если щелкнуть правой кнопкой мыши таблицу иперейти к дизайну и ввести выше для «Формула» в разделе «Спецификация вычисляемого столбца», я получаю следующую ошибку:

- Невозможно изменить таблицу.
Пользовательская функцияимя не может быть префиксом с именем базы данных в этом контексте.

Поэтому я подумал, что буду использовать пользовательскую функцию для вычисления хэша и сопоставления этого 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' недопустимо для схемы binding.Имена должны быть в формате, состоящем из двух частей, и объект не может ссылаться на себя. *

Когда я удалил префикс db "MASTER", я получил эту ошибку:

* Невозможнофункция привязки схемы 'udfHashAddress', поскольку она ссылается на системный объект 'SYS.FN_VARBINTOHEXSUBSTRING'. *

Я что-то здесь упустил?Был бы признателен за любую помощь / указатели.

1 Ответ

6 голосов
/ 01 августа 2011

Поскольку вы используете 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];
...