字符串(varchar)和二进制(varbinary)互转

参考资料:

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) 


你可能感兴趣的:(Sql,Server,实用)