在SQL中,如何将字符串'00EDDAFB'转换为十六进制的数值0x00EDDAFB.

时间:2022-02-08 22:45:45
在SQL中,如何将字符串'00EDDAFB'转换为十六进制的数值0x00EDDAFB.

6 个解决方案

#1


sql server没有16进制数据类型,自己写算法.
建议在前台程序里做.

#2


declare @str varchar(100),@sql nvarchar(100),@binary varbinary(8)

set @str='00EDDAFB'
set @sql=N'set @binary=0x'+@str

exec sp_executesql @sql,N'@binary varbinary(8) out',@binary out

select @binary

#3


我将楼上的语句放进SQL的自定义函数如下: 结果每次执行都报错.

CREATE FUNCTION [dbo].[Str16_to_chr8] (@lc_str16 char(8))  
RETURNS char(8)
AS  
BEGIN 
declare @sql nvarchar(100), @binary varbinary(8), @return char(8)
--------------------------------------------------------------------------------------------------------
set @sql=N'set @binary=0x'+@lc_str16
exec sp_executesql @sql,N'@binary varbinary(8) out',@binary out
--------------------------------------------------------------------------------------------------------
set @return = cast(replicate('0',(8-len(cast(cast(@binary as int) as char(8)))))+cast(cast(@binary as int) as char(8)) as char(8))
--------------------------------------------------------------------------------------------------------
return @return
end


执行语句如下:
select [dbo].Str16_to_chr8('00EDDAFB')

错误提示如下:
服务器: 消息 557,级别 16,状态 2,过程 Str16_to_chr8,行 9
只有函数和扩展存储过程才能从函数内部执行。

请问应该如何改?




#4


看来UDF里不支持用exec sp_executesql的用法, LZ还是用C#或者VB写一个这样的UDF函数吧.

#5


--函数参考下面改改

declare @Str varchar(10)
set @Str='00EDDAFB'

/*
if patindex('%[^0-9a-fA-F]%',@Str)>0
return (null)
*/

declare @Position int,@4bit int,@Return varbinary(8)
select @Position=len(@Str),@4bit=0,@Return=0
while @Position>0
begin
set @Return=@Return+
(
case isnumeric(substring(@Str,@Position,1))
when 0 then ascii(upper(substring(@Str,@Position,1)))-55
else substring(@Str,@Position,1)
end
)*power(convert(bigint,16),@4bit)
select @Position=@Position-1,@4bit=@4bit+1
end

select @Return

#6


不大好吧? 效率肯定要比用C#/VB写出来的UDF差很多.

#1


sql server没有16进制数据类型,自己写算法.
建议在前台程序里做.

#2


declare @str varchar(100),@sql nvarchar(100),@binary varbinary(8)

set @str='00EDDAFB'
set @sql=N'set @binary=0x'+@str

exec sp_executesql @sql,N'@binary varbinary(8) out',@binary out

select @binary

#3


我将楼上的语句放进SQL的自定义函数如下: 结果每次执行都报错.

CREATE FUNCTION [dbo].[Str16_to_chr8] (@lc_str16 char(8))  
RETURNS char(8)
AS  
BEGIN 
declare @sql nvarchar(100), @binary varbinary(8), @return char(8)
--------------------------------------------------------------------------------------------------------
set @sql=N'set @binary=0x'+@lc_str16
exec sp_executesql @sql,N'@binary varbinary(8) out',@binary out
--------------------------------------------------------------------------------------------------------
set @return = cast(replicate('0',(8-len(cast(cast(@binary as int) as char(8)))))+cast(cast(@binary as int) as char(8)) as char(8))
--------------------------------------------------------------------------------------------------------
return @return
end


执行语句如下:
select [dbo].Str16_to_chr8('00EDDAFB')

错误提示如下:
服务器: 消息 557,级别 16,状态 2,过程 Str16_to_chr8,行 9
只有函数和扩展存储过程才能从函数内部执行。

请问应该如何改?




#4


看来UDF里不支持用exec sp_executesql的用法, LZ还是用C#或者VB写一个这样的UDF函数吧.

#5


--函数参考下面改改

declare @Str varchar(10)
set @Str='00EDDAFB'

/*
if patindex('%[^0-9a-fA-F]%',@Str)>0
return (null)
*/

declare @Position int,@4bit int,@Return varbinary(8)
select @Position=len(@Str),@4bit=0,@Return=0
while @Position>0
begin
set @Return=@Return+
(
case isnumeric(substring(@Str,@Position,1))
when 0 then ascii(upper(substring(@Str,@Position,1)))-55
else substring(@Str,@Position,1)
end
)*power(convert(bigint,16),@4bit)
select @Position=@Position-1,@4bit=@4bit+1
end

select @Return

#6


不大好吧? 效率肯定要比用C#/VB写出来的UDF差很多.