请教sql server中nchar的用法问题

UlikeLeo 2009-05-31 11:20:28
在sql server中,希望将一字段中的16进制字符双双转换成asc字符后相加,即
declare @s varchar(100)
set @s='ffffffffffff'
希望得到的是转换后的字符串:ÿÿÿÿÿÿ,即ff->ÿ,在操作上采用循环的方法进行相加,但得不到希望的结果,方法如下:

declare @s varchar(100),@s1 nchar(100),@s2 nchar(1),@s3 nchar(1),@s4 nchar(1),@s5 nchar(1),@s6 nchar(1),@i int
declare @sx nchar(6);
set @s='ffffffffffff';
set @i=0
set @s1=''
--set @s1=NCHAR(dbo.hextoint(substring(@s,1,2)));
--set @s2=NCHAR(dbo.hextoint(substring(@s,3,2)));
--set @s3=NCHAR(dbo.hextoint(substring(@s,5,2)));
--set @s4=NCHAR(dbo.hextoint(substring(@s,7,2)));
--set @s5=NCHAR(dbo.hextoint(substring(@s,9,2)));
--set @s6=NCHAR(dbo.hextoint(substring(@s,11,2)));
--set @sx=convert(nchar(1),@s1)+@s2+@s3+@s4+@s5+@s6
--select @sx

while @i<6
begin
set @s1 = convert(nchar(1),@s1)+convert(nchar(1),NCHAR(dbo.hextoint(substring(@s,@i+1,2))));
set @i=@i+2
end
select @s1
-- 结果为 ÿÿ,而不是所要的:ÿÿÿÿÿÿ

-- 借用的函数为:
create function [dbo].[hextoint](@h varchar(8))
returns bigint
as
begin
declare @r bigint
set @r=0
declare @i bigint
set @i=1
while @i<=len(@h)
begin
set @r=@r+
convert(int,
(
case
when substring(@h,@i,1)<='9' then substring(@h,@i,1)
when substring(@h,@i,1)<='A' then '10'
when substring(@h,@i,1)<='B' then '11'
when substring(@h,@i,1)<='C' then '12'
when substring(@h,@i,1)<='D' then '13'
when substring(@h,@i,1)<='E' then '14'
when substring(@h,@i,1)<='F' then '15'
end
))
*power(16,len(@h)-@i)
set @i=@i+1
end
return @r
end


希望高手指点迷津,谢谢!
...全文
216 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
-狙击手- 2009-06-01
  • 打赏
  • 举报
回复
declare @s varchar(100)
set @s='ff00ff00ff00ff00ff00'
exec('select cast(0x'+@s+' as nchar)')
-狙击手- 2009-06-01
  • 打赏
  • 举报
回复
declare @s varchar(100) 
set @s='ff00ff00ff00ff00ff00'
exec('select cast(cast(0x'+@s+' as varbinary) as nchar)')

/*

------------------------------
ÿÿÿÿÿ



*/

wuguanlin 2009-06-01
  • 打赏
  • 举报
回复
发错了。。。
wuguanlin 2009-06-01
  • 打赏
  • 举报
回复
收藏了网页。
我英语水平不怎样,估计得看好久了,。。。。
--小F-- 2009-06-01
  • 打赏
  • 举报
回复
顶个 明天看
jiangshun 2009-06-01
  • 打赏
  • 举报
回复
先UP
kye_jufei 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 happyflystone 的回复:]
SQL codedeclare @s varchar(100),@s1 nvarchar(100),@s2 nvarchar(100),@s3 nchar(1),@s4 nchar(1),@s5 nchar(1),@s6 nchar(1),@i int
declare @sx nchar(6)
set @s='ffffffffffff';
set @i=0
set @s1=''
set @s2=N''
declare @t nvarchar(1000)

while @i <6
begin
set @t = 'set @s1 = NCHAR(0x'+substring(@s,@i+1,2)+')'
exec sp_executesql @t,N'@s1 nvarchar(10) out',@s1 out

set @s2 = @s2 +…
[/Quote]
up
youzhj 2009-06-01
  • 打赏
  • 举报
回复
学习学习,来帮顶一下!
ai_li7758521 2009-06-01
  • 打赏
  • 举报
回复
学习
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 happyflystone 的回复:]
SQL codedeclare@svarchar(100),@s1nvarchar(100),@s2nvarchar(100),@s3nchar(1),@s4nchar(1),@s5nchar(1),@s6nchar(1),@iintdeclare@sxnchar(6)set@s='ffffffffffff';set@i=0set@s1=''set@s2=N''declare@tnvarchar(1000)while@i<6beginset@t='set @s1 = NCHAR(0x'+substring(@s,@i+1,2)+')'execsp_executesql@t,N'@s1 nvarchar(10) out',@s1outset@s2=@s2+@s1set@i=@i+2endselect@s2/*----------------------------------------…
[/Quote]
  • 打赏
  • 举报
回复
大概看了下:
这些地方有些问题:
when substring(@h,@i,1) <='9' then substring(@h,@i,1)
when substring(@h,@i,1) ='A' then '10'
when substring(@h,@i,1) ='B' then '11'
when substring(@h,@i,1) ='C' then '12'
when substring(@h,@i,1) ='D' then '13'
when substring(@h,@i,1) ='E' then '14'
when substring(@h,@i,1) ='F' then '15'

其余的没仔细看,楼主再调试吧

-狙击手- 2009-06-01
  • 打赏
  • 举报
回复
declare @s varchar(100),@s1 nvarchar(100),@s2 nvarchar(100),@s3 nchar(1),@s4 nchar(1),@s5 nchar(1),@s6 nchar(1),@i int 
declare @sx nchar(6)
set @s='ffffffffffff';
set @i=0
set @s1=''
set @s2=N''
declare @t nvarchar(1000)

while @i <6
begin
set @t = 'set @s1 = NCHAR(0x'+substring(@s,@i+1,2)+')'
exec sp_executesql @t,N'@s1 nvarchar(10) out',@s1 out

set @s2 = @s2 +@s1
set @i=@i+2
end
select @s2
/*

----------------------------------------------------------------------------------------------------
ÿÿÿ
*/

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧