SQL将十六进制格式的字符串数据转换成字符串文本

3 人关注

我有一个表,其中有一列X。X将以十六进制格式存储大的文本值。现在我想将十六进制转换为原始格式并验证数据。但是当我使用下面的查询时。 我在运行查询后只得到部分文本,而不是完整的文本。事实上,原始文本是非常大的....

select UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW(X)) as a from table name 

我也尝试了下面的查询,但没有用,它也提取了同样的内容。

decalre @a varchar(max)
select UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW(X)) as new  from table name.

请让我知道我怎样才能从sql中提取或看到大的文本。样品查询可能会有帮助。

1 个评论
你确定你使用的是Microsoft SQL Server 2008吗?AFAIK HEXTORAW()是一个Oracle DB函数...?下面的链接可能有帮助 --> blogs.msdn.com/b/sqltips/archive/2008/07/02/ ...
sql
sql-server-2008
Rajnavakoti
Rajnavakoti
发布于 2014-02-06
3 个回答
robnick
robnick
发布于 2014-07-16
0 人赞同

对于MS-SQL 2008,以下存储过程将把一个十六进制字符串转换成varchar(max)。

if exists (select * from dbo.sysobjects where name = 'f_hextostr' and xtype = 'FN')
drop function [dbo].[f_hextostr]
CREATE FUNCTION [dbo].[f_hextostr] (@hexstring VARCHAR(max))
RETURNS VARCHAR(max)
begin
 declare @char1 char(1), @char2 char(1), @strlen int, @currpos int, @result varchar(max)
 set @strlen=len(@hexstring)
 set @currpos=1
 set @result=''
 while @currpos<@strlen
  begin
   set @char1=substring(@hexstring,@currpos,1)
   set @char2=substring(@hexstring,@currpos+1,1)
   if (@char1 between '0' and '9' or @char1 between 'A' and 'F')
    and (@char2 between '0' and '9' or @char2 between 'A' and 'F')
    set @result=@result+
     char((ascii(@char1)-case when @char1 between '0' and '9' then 48 else 55 end)*16+
     ascii(@char2)-case when @char2 between '0' and '9' then 48 else 55 end)
   set @currpos = @currpos+2
 return @result

使用时,只需做以下工作。

select dbo.f_hextostr('0x3031323')
select dbo.f_hextostr(X) from MyTable
    
gknicker
gknicker
发布于 2014-07-16
0 人赞同

这可以在SQL服务器中通过varbinary数据类型使用内置的转换功能来完成。

-- VARCHAR TO (HEX) VARCHAR
SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), 'Help'), 1) -- '0x48656C70'
-- (HEX) VARCHAR TO VARCHAR
SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), '0x48656c70', 1)) -- 'Help' (requires 0x)
SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), '48656c70', 2)) -- 'Help' (assumes 0x)
    
user3842105
user3842105
发布于 2014-07-16
0 人赞同

似乎这对我来说效果更好。

if exists (select * from dbo.sysobjects where name = 'HexToStr' and xtype = 'FN')
drop function [dbo].[HexToStr]
CREATE FUNCTION [dbo].[HexToStr] (@hexstring VARCHAR(max))
RETURNS VARCHAR(max)