保留VARBINARY值并将其作为varchar存储到另一个变量中

时间:2014-08-19 19:35:54

标签: sql sql-server tsql

DECLARE @Blob VARBINARY(256) = CAST('SOMETHING' AS VARBINARY(256))
DECLARE @Var VARCHAR(256)

SELECT @Blob

上述查询的结果为0x534F4D455448494E47

SELECT @Var = CAST(@Blob AS varchar)
SELECT @Var

我想将@Blob值保存在参数(@Var)中varchar,但它只是将其转换回'SOMETHING'。有解决方法吗?

由于

1 个答案:

答案 0 :(得分:2)

就个人而言,我只是将字节存储在数据库中,并根据需要在应用程序中转换为十六进制,而不是将十六进制存储在数据库中。但...

你不能做varchar(256),因为如果你有十六进制的256个字节,那么它将是双倍(512),加上前导0x,如果你想要的话,为514总人物。

但如果这就是你想要的,看起来微软还没有给你一个内置功能,但他们提供了一个例子,找到here

create procedure sp_hexadecimal
  @binvalue varbinary(255)
as
declare @charvalue varchar(255)
declare @i int
declare @length int
declare @hexstring char(16)

select @charvalue = '0x'
select @i = 1
select @length = datalength(@binvalue)
select @hexstring = '0123456789abcdef'

while (@i <= @length)
begin

  declare @tempint int
  declare @firstint int
  declare @secondint int

  select @tempint = convert(int, substring(@binvalue,@i,1))
  select @firstint = floor(@tempint/16)
  select @secondint = @tempint - (@firstint*16)

  select @charvalue = @charvalue +
    substring(@hexstring, @firstint+1, 1) +
    substring(@hexstring, @secondint+1, 1)

  select @i = @i + 1

end

select 'sp_hexadecimal'=@charvalue