在计算列中使用master.sys.fn_varbintohexsubstring

mur*_*uge 2 sql-server ssms calculated-columns sql-server-2008

在我的sql server表中,我想添加一个计算列,它是同一个表中其他列的哈希值.下面是我的表格结构.

地址:
AddressID(int,PK)
AddressLine1(nvarchar)
AddressLine2(nvarchar)
City(nvarchar)
State(nvarchar)
AddressHash(computed column)

以下是我想在计算列中得到的内容:

MASTER.SYS.FN_VARBINTOHEXSUBSTRING(0, HASHBYTES('SHA1',COALESCE(AddressLine1, N'') + COALESCE(AddressLine2, N'') + COALESCE(City, N'') + COALESCE(State, N'')), 1, 0)
Run Code Online (Sandbox Code Playgroud)

如果我右键单击该表并转到设计并在"计算列规范"下输入上面的"公式",我会收到以下错误:

- 无法修改表格.
在此上下文中,用户定义的函数名称不能以数据库名称为前缀.

所以我想我会使用用户定义的函数来计算哈希并将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
Run Code Online (Sandbox Code Playgroud)

但是我使用上面的代码得到以下错误:

*无法模式绑定函数'udfHashAddress',因为名称'MASTER.SYS.FN_VARBINTOHEXSUBSTRING'对于模式绑定无效.名称必须采用两部分格式,并且对象不能引用自身.*

当我删除"MASTER"数据库前缀时,我收到此错误:

*无法模式绑定函数'udfHashAddress',因为它引用了系统对象'SYS.FN_VARBINTOHEXSUBSTRING'.*

我在这里错过了什么吗?非常感谢任何帮助/指针.

Aar*_*and 6

由于您使用的是SQL Server 2008,您是否尝试过:

CONVERT(VARCHAR(MAX), HASHBYTES('SHA1','string'), 2);
Run Code Online (Sandbox Code Playgroud)

这将返回大写字母而不是小写字母,但如果它很重要,你可以使用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];
Run Code Online (Sandbox Code Playgroud)

  • PS你可以把它放在计算列定义中而不引用UDF ...但是尽量避免使用右键单击设计来修改表.使用ALTER TABLE ...它的错误和不直观. (2认同)