参考资料:
1、http://blog.sina.com.cn/s/blog_4d2d94f20100ldx6.html
2、http://blog.csdn.net/chelen_jak/article/details/79385348
/*
功能:字符串(16进制)转barbinary(可变长度二进制)
说明:Sql2008 R2上测试通过
*/
CREATE FUNCTION dbo.hexstr2varbin
(
@hexstr varchar(max)
)
RETURNS varbinary(max)
AS
BEGIN
DECLARE @value int
DECLARE @ascii int
DECLARE @varbin varbinary(max)
IF @hexstr LIKE '0x%'
SET @hexstr = STUFF(@hexstr,1,2,'')
SET @hexstr = UPPER(@hexstr)
IF @hexstr NOT LIKE '%[^0-9A-F]%' COLLATE Chinese_PRC_BIN
BEGIN
SET @varbin = 0x
WHILE @hexstr <> ''
BEGIN
SET @value = ASCII(SUBSTRING(@hexstr,1,1))
IF @value <= 57
SET @value = @value - 48
ELSE
SET @value = @value - 55
SET @ascii = @value * 16
SET @value = ASCII(SUBSTRING(@hexstr,2,1))
IF @value <= 57
SET @value = @value - 48
ELSE
SET @value = @value - 55
SET @ascii = @ascii + @value
SET @varbin = @varbin + CAST(@ascii AS binary(1))
SET @hexstr = STUFF(@hexstr,1,2,'')
END
END
RETURN @varbin
END
/*
测试代码
*/
declare @str nvarchar(max)
declare @bary varbinary(max)
-- 原字符
set @str = N'abc中国12中國3香港中華128467號@<>「」xyza' -- 注意:前加加上N
-- 转16进制
set @bary= cast(@str as varbinary(max))
select @bary
-- bin -> string
declare @s1 nvarchar(max)
--set @s1 = sys.fn_varbintohexstr(@bary) -- 有0x开头
set @s1 = sys.fn_varbintohexsubstring(0, @bary, 1, 0) -- 无0x开头 (第1个参数表示是否保留0x前缀,1为保留,0为不保留)
select @s1
-- string -> bin
declare @bin varbinary(max)
set @bin = dbo.hexstr2varbin(@s1) -- 自定义函数
select @bin
-- 还原
select convert(nvarchar(max), @bin)