varbinary to varchar w / o master.dbo.fn_varbintohexstr

时间:2011-07-09 19:47:08

标签: sql sql-server-2005 varchar varbinary

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

CONVERT和CAST返回非ASCII字符串。

谢谢,

丹尼斯。

1 个答案:

答案 0 :(得分:4)

对于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)