【问题标题】:varbinary to varchar w/o master.dbo.fn_varbintohexstrvarbinary 到 varchar w/o master.dbo.fn_varbintohexstr
【发布时间】:2011-10-01 23:59:57
【问题描述】:

在 MS SQL Server 2005 上没有 master.dbo.fn_varbintohexstr 函数的情况下,有什么方法可以将 varbinary 转换为 ASCII varchar 字符串(base64、md5、sha1 - 无论如何)?因为它不能在计算列内部使用。

CONVERT 和 CAST 返回非 ASCII 字符串。

谢谢,

丹尼斯。

【问题讨论】:

    标签: sql sql-server-2005 varchar varbinary


    【解决方案1】:

    对于 md5 和 sha1,您可以使用 hashbytes。要获得 base64,您可以创建一个进行转换的 udf 并在您的计算列中使用它。

    函数 BinToBase64:

    create function BinToBase64(@Bin varbinary(max)) returns varchar(max) as
    begin
      return CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:variable("@Bin")))', 'VARCHAR(MAX)')
    end
    

    函数 BinToHexString:

    create function BinToHexString(@Bin varbinary(max)) returns varchar(max) as
    begin
      return '0x' + cast('' as xml).value('xs:hexBinary(sql:variable("@Bin") )', 'varchar(max)'); 
    end
    

    这样使用:

    create table TestTable 
    (
      Col1 varbinary(max), 
      Col2 as dbo.BinToHexString(hashbytes('MD5', Col1)),
      Col3 as dbo.BinToHexString(hashbytes('SHA1', Col1)),
      Col4 as dbo.BinToBase64(Col1),
    )
    insert into TestTable values (12345)
    
    select *
    from TestTable
    

    使用 hashbytes 和 uniqueidentifier 列的唯一约束 varbinary 列

    create table TestTable 
    (
      ID uniqueidentifier default(newid()),
      Col1 varbinary(max), 
      Col2 as coalesce(hashbytes('MD5', Col1), cast(ID as varbinary(8000))) persisted
    )
    
    create unique index IX_TestTable_Col2 on TestTable(Col2)
    

    【讨论】:

    • 您的 Col2 和 Col3 包含 0x00 字符串,但是当我尝试将 HashBytes 输出转换为 varchar 时,我收到了中国象形文字。我错过了什么吗?
    • @Denis - hashbytes 返回一个 varbinary。不确定您是否也希望将它们作为字符串。使用从 varbinary 转换为十六进制字符串的函数更新了答案。
    • 谢谢!有用!但不幸的是,它使列不确定,也不能在计算列内部使用。我会尝试寻找其他架构决策。
    • @Denis - 好吧,它可以在计算列中使用。这就是我在 TestTable 中所做的。它不能是持久的计算列。
    • 最终解决方案是:isnull(CONVERT([uniqueidentifier],hashbytes('MD5',[Email]),(0)), CONVERT([uniqueidentifier],hashbytes('MD5',CONVERT([varchar](20),[Id],(0))),(0)))
    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多