T-SQL: 关于 Varbinary(Hex,Int) 与 Varchar(HexString) 之间的(数据类型)转换

T-SQL: 关于 Varbinary(Hex,Int) 与 Varchar(HexString) 之间的数据类型转换
我以前只是用存储过程简单地实现了:
16进制数的字符串表达 转变为 真正的16进制数:
例如: '0x5f' 转换成 16进制的 0x5f

None.gif declare  @  varbinary ( 8000 )
None.gif
declare   @s   varchar ( 100 )
None.gif
declare   @sql   nvarchar ( 100 )
None.gif
set   @s   =   ' 0xFFFF '
None.gif
set   @sql   =  N ' set @ =  '   +   cast ( @s   as   nvarchar ( 100 ))
None.gif
exec  SP_EXECUTESQL  @sql  ,N ' @ varbinary(8000) out ' , @ out
None.gif
select  @

该方法属于投机取巧,只实现了 HexString to Hex 的单向转换,而且不能用 "自定义函数(udf)" 实现!
利用这种方式还有一篇 blog@csdn: 实现了:

《用于执行(计算) "字符串表达式" 的 T-SQL 存储过程》
http://blog.csdn.net/playyuer/archive/2004/12/08/208601.aspx


今天在 google 搜到
http://www.google.com/search?hl=zh-CN&newwindow=1&q=HexToSMALLINT+HexToINT&btnG=%E6%90%9C%E7%B4%A2&lr=
现成儿的,这两篇好东西:

HexToInt
http://www.sqlservercentral.com/scripts/contributions/1495.asp

None.gif --  By Aaron West, 5/4/2005
None.gif--
 This version allows negative numbers
None.gif
CREATE   FUNCTION  dbo.HexToINT
None.gif(
None.gif 
@Value   VARCHAR ( 8 )
None.gif)
None.gif
RETURNS   INT
None.gif
AS
None.gif
BEGIN
None.gif   
if   @Value   LIKE   ' %[^0-9A-Fa-f]% '
None.gif      
RETURN   NULL
None.gif   
DECLARE   @I   BIGINT
None.gif   
SET   @I   =   CAST ( CAST ( RIGHT ( UPPER ( ' 00000000 '   +   @Value ), 8 AS   BINARY ( 8 ))  AS   BIGINT -   CAST ( 0x3030303030303030   AS   BIGINT )
None.gif   
SET   @I = @I - (( @I / 16 ) & CAST ( 0x0101010101010101   AS   BIGINT )) * 7
None.gif   
RETURN   CAST ( CAST (
None.gif                    (
@I & 15 )
None.gif                    
+ (( @I / 16 ) & 240 )
None.gif                    
+ (( @I / 256 ) & 3840 )
None.gif                    
+ (( @I / 4096 ) & 61440 )
None.gif                    
+ (( @I / 65536 ) & 983040 )
None.gif                    
+ (( @I / 1048576 ) & 15728640 )
None.gif                    
+ (( @I / 16777216 ) & 251658240 )
None.gif                    
+ ( @I / CAST ( 0x0100000000000000   AS   BIGINT ) * 268435456
None.gif                    
AS   BINARY ( 4 )) AS   INT )
None.gif
END
None.gif
GO
None.gif
None.gif
SELECT  
None.gif    dbo.HexToINT(
' 0ABC ' ) , 
None.gif    dbo.HexToINT(
' 7FFF ' ) , 
None.gif    dbo.HexToINT(
' 0FFF ' ) , 
None.gif    dbo.HexToINT(
' 0 ' )     AS  Zero, 
None.gif    dbo.HexToINT(
' 7FFFFFFF ' AS  MaxValue,
None.gif    dbo.HexToINT(
' 80000000 ' AS  MaxNeg,
None.gif    dbo.HexToINT(
' FFFFFFFF ' AS  NegOne
None.gif

faster dbo.ufn_vbintohexstr - varbinary to hex
http://www.sqlservercentral.com/scripts/contributions/1497.asp

None.gif create   function  dbo.ufn_vbintohexstr
None.gif(
None.gif 
@vbin_in   varbinary ( 256 )
None.gif)
None.gif
returns   varchar ( 514 )
None.gif
as
None.gif
Begin
None.gif   
declare   @x   bigint
None.gif   
declare   @len   int
None.gif   
declare   @loop   int
None.gif   
declare   @value   varbinary ( 514 )
None.gif   
set   @value   =  0x
None.gif   
set   @loop   =   1
None.gif   
set   @len   =   datalength ( @vbin_in )
None.gif   
if  ( @len   &   1 <>   0
None.gif      
set   @vbin_in   =   0x00   +   @vbin_in
None.gif   
if  ( @len   &   3 <   3
None.gif      
set   @vbin_in   =   0x0000   +   @vbin_in
None.gif   
while   @loop   <=   @len
None.gif      
begin
None.gif         
set   @x   =   CAST ( substring ( @vbin_in , @loop , 4 ) AS   BIGINT )
None.gif         
set   @x   = 65536 *
None.gif          ( (
@x & 0xF0000000 ) * 4096
None.gif           
+ ( @x & 0x0F000000 ) * 256
None.gif           
+ ( @x & 0x00F00000 ) * 16
None.gif           
+ ( @x & 0x000F0000 ) )
None.gif           
+ ( @x & 0xF000 ) * 4096
None.gif           
+ ( @x & 0x0F00 ) * 256
None.gif           
+ ( @x & 0x00F0 ) * 16
None.gif           
+ ( @x & 0x000F )
None.gif         
set   @x   =  ( @x   |   0x3030303030303030 ) +
None.gif             ((
@x + 0x0606060606060606 ) / 16
None.gif                
&   0x0101010101010101 ) * 7
None.gif         
select   @value    =   @value   +   CAST ( @x   AS   BINARY ( 8 ))
None.gif         
set   @loop   =   @loop   +   4
None.gif      
end
None.gif   
return   ' 0x ' +   right ( CAST ( @value   AS   VARCHAR ( 514 )),  @len * 2 )
None.gif
end
None.gif
GO
None.gif
select  dbo.ufn_vbintohexstr( 0x123456789abcdef1234 )
None.gif
--  outputs: 0x0123456789ABCDEF1234
None.gif
GO

转载于:https://www.cnblogs.com/Microshaoft/archive/2005/05/13/154557.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值