sql中十六进制字符串如何转换为长整型

soliddream66 软件开发工程师  2009-01-14 01:51:48
select cast('00000E' as int) as sequence
提示:在将 varchar 值 '00000E' 转换成数据类型 int 时失败。

顺带问个

具体是根据字段的重复值自动增长

比如
1 1
1 2
1 3
2 1
2 2
3 1
前面一列是字段值,后面一列根据第一列自动增长
不知道能否明白?表述不太好表述

谢谢了,很急用~

...全文
1692 16 点赞 打赏 收藏 举报
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lizhongqian 2010-03-09
GFTTRWWEEWEWQEWQEWQEWQRERWRER
  • 打赏
  • 举报
回复
kevenquwei 2010-01-25
应该好好学习下
  • 打赏
  • 举报
回复
yuliang0912 2009-09-23
看同上!
  • 打赏
  • 举报
回复
jftasjl 2009-08-04
为了看答案 ,我只能回复了
  • 打赏
  • 举报
回复
soliddream66 2009-01-15
[Quote=引用 10 楼 wufeng4552 的回复:]
HTML codeSql Server2005 4个排名函数: RANK(),DENSE_RANK(),ROW_NUMBER(),NTILE()
下面是对这4个函数的解释:
RANK()
返回结果集的分区内每行的排名。行的排名是相关行之前的排名数加一。
如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名。
例如,如果两位销售员具有相同的SalesYTD值,则他们将并列第一。由于已有两行排名在前,所以具有下一个最大SalesYTD的销售人员将排名第三。
因此,RANK 函数并不总返回连…
[/Quote]

先学习了,我是在sql 2005下开发的,但是实际应用是sql 2000,谁叫现在的托管的服务器都是xp的系统以及sql 2000的数据库呢。

  • 打赏
  • 举报
回复
soliddream66 2009-01-14
[Quote=引用 6 楼 dobear_0922 的回复:]
引用 4 楼 soliddream66 的回复:
3楼,很精妙,学习了

问题是如果cnt不是tb的一个字段呢,条件里面的cnt <=t.cnt该如何改呢?

我程序里面调用的sql语句,根据字段增长是额外添加的,原数据库中没有


SQL2005可以用自动编号,
十六进制转十进制可以自己写函数。
[/Quote]

OK~搞定,Thx~
  • 打赏
  • 举报
回复
水族杰纶 2009-01-14
Sql Server2005 4个排名函数: RANK(),DENSE_RANK(),ROW_NUMBER(),NTILE() 
下面是对这4个函数的解释:
RANK()
返回结果集的分区内每行的排名。行的排名是相关行之前的排名数加一。
如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名。
例如,如果两位销售员具有相同的SalesYTD值,则他们将并列第一。由于已有两行排名在前,所以具有下一个最大SalesYTD的销售人员将排名第三。
因此,RANK 函数并不总返回连续整数。
DENSE_RANK()
返回结果集分区中行的排名,在排名中没有任何间断。行的排名等于所讨论行之前的所有排名数加一。
如果有两个或多个行受同一个分区中排名的约束,则每个约束行将接收相同的排名。
例如,如果两位顶尖销售员具有相同的 SalesYTD 值,则他们将并列第一。接下来 SalesYTD 最高的销售人员排名第二。该排名等于该行之前的所有行数加一。
因此,DENSE_RANK 函数返回的数字没有间断,并且始终具有连续的排名。
ROW_NUMBER()
回结果集分区内行的序列号,每个分区的第一行从 1 开始。
ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
NTILE()
将有序分区中的行分发到指定数目的组中。各个组有编号,编号从一开始。对于每一个行,NTILE 将返回此行所属的组的编号。
如果分区的行数不能被 integer_expression 整除,则将导致一个成员有两种大小不同的组。按照 OVER 子句指定的顺序,较大的组排在较小的组前面。
例如,如果总行数是 53,组数是 5,则前三个组每组包含 11 行,其余两个组每组包含 10 行。
另一方面,如果总行数可被组数整除,则行数将在组之间平均分布。
例如,如果总行数为 50,有五个组,则每组将包含 10 行。
--演示例题,建一个table
create table rankorder(
orderid int,
qty int
)
go
--插入数据
insert rankorder values(30,10)
insert rankorder values(10,10)
insert rankorder values(80,10)
insert rankorder values(40,10)
insert rankorder values(30,15)
insert rankorder values(30,20)
insert rankorder values(22,20)
insert rankorder values(21,20)
insert rankorder values(10,30)
insert rankorder values(30,30)
insert rankorder values(40,40)
go
--查询出各类排名
SELECT orderid,qty,
ROW_NUMBER() OVER(ORDER BY qty) AS rownumber,
RANK() OVER(ORDER BY qty) AS [rank],
DENSE_RANK() OVER(ORDER BY qty) AS denserank ,
NTILE(3) OVER(ORDER BY qty) AS [NTILE]
FROM rankorder
ORDER BY qty
--结果
--ROW_NUMBER()是按qty由小到大逐一排名,不并列,排名连续
--RANK()是按qty由小到大逐一排名,并列,排名不连续
--DENSE_RANK()是按qty由小到大逐一排名,并列,排名连续
--NTILE()是按qty由小到大分成3组逐一排名,并列,排名连续
orderid qty rownumber rank denserank NTILE
30 10 1 1 1 1
10 10 2 1 1 1
80 10 3 1 1 1
40 10 4 1 1 1
30 15 5 5 2 2
30 20 6 6 3 2
22 20 7 6 3 2
21 20 8 6 3 2
10 30 9 9 4 3
30 30 10 9 4 3
40 40 11 11 5 3
sql 2005实现排名非常方便,但是用sql 2000实现排名就比较麻烦,下面是sql 2000的实现代码
--RANK在sql 2000中的实现
select orderid,qty,
(select count(1)+1 from rankorder where qty<r.qty) as [rank]
from rankorder r
ORDER BY qty
go
--ROW_NUMBER在sql 2000中的实现
--利用临时表和IDENTITY(函数)
select identity(int,1,1) as [ROW_NUMBER],orderid,qty
into #tem
from rankorder
select orderid,qty,[ROW_NUMBER]
from #tem
drop table #tem
go
--DENSE_RANK在sql 2000中的实现
select identity(int,1,1) as ids, qty
into #t
from rankorder
group by qty
order by qty
select r.orderid,r.qty,t.ids as [DENSE_RANK]
from rankorder r join #t t
on r.qty=t.qty
drop table #t
go
排名函数是与窗口函数OVER()配合一起使用的。
如果借助OVER子句的参数PARTITION BY,就可以将结果集分为多个分区。排名函数将在每个分区内进行排名.
--例题
SELECT orderid,qty,
DENSE_RANK() OVER(ORDER BY qty) AS a ,
DENSE_RANK() OVER(PARTITION BY orderid ORDER BY qty) AS b
FROM rankorder
ORDER BY qty
--说明:
--a列是在全部记录上进行的排名
--b列是把orderid中的记录分成了10,21,22,30,40,80这6个区,再在每个区上进行的排名。
orderid qty a b
10 10 1 1
30 10 1 1
40 10 1 1
80 10 1 1
30 15 2 2
30 20 3 3
21 20 3 1
22 20 3 1
10 30 4 2
30 30 4 4
40 40 5 2
我们看到排名函数可以很简便的得到各种类型的排名
  • 打赏
  • 举报
回复
水族杰纶 2009-01-14
set nocount on
if object_id('tb')is not null drop table tb
go
create table tb( ID int)
insert tb select 1
insert tb select 1
insert tb select 1
insert tb select 2
insert tb select 2
insert tb select 3
--2005
select id,
row_number()over(partition by id order by id) as cnt from tb
/*id cnt
----------- --------------------
1 1
1 2
1 3
2 1
2 2
3 1*/
  • 打赏
  • 举报
回复
dobear_0922 2009-01-14
CREATE FUNCTION fn(@hexstr varchar(16))
returns bigint as
begin
declare @i int, @bi bigint
set @bi=0
set @hexstr=stuff(@hexstr,1,patindex('%[^0]%',@hexstr)-1,'')
while @hexstr<>''
begin
set @bi=@bi*16+charindex(left(@hexstr,1),'0123456789ABCDEF')
set @hexstr=stuff(@hexstr,1,1,'')
end
return @bi
end
go


select dbo.fn('00000E'), dbo.fn('00021FF')
/*
-------------------- --------------------
15 13072

(1 行受影响)
*/

drop function dbo.fn
  • 打赏
  • 举报
回复
dobear_0922 2009-01-14
if object_id('tb')is not null drop table tb
go
create table tb( ID int)
insert tb select 1
insert tb select 1
insert tb select 1
insert tb select 2
insert tb select 2
insert tb select 3

select ID, cnt=(ROW_NUMBER() over(partition by ID order by ID)) from tb
/*
ID cnt
----------- --------------------
1 1
1 2
1 3
2 1
2 2
3 1

(6 行受影响)
*/

drop table tb
  • 打赏
  • 举报
回复
dobear_0922 2009-01-14
[Quote=引用 4 楼 soliddream66 的回复:]
3楼,很精妙,学习了

问题是如果cnt不是tb的一个字段呢,条件里面的cnt <=t.cnt该如何改呢?

我程序里面调用的sql语句,根据字段增长是额外添加的,原数据库中没有
[/Quote]

SQL2005可以用自动编号,
十六进制转十进制可以自己写函数。
  • 打赏
  • 举报
回复
水族杰纶 2009-01-14
[Quote=引用 4 楼 soliddream66 的回复:]
3楼,很精妙,学习了

问题是如果cnt不是tb的一个字段呢,条件里面的cnt <=t.cnt该如何改呢?

我程序里面调用的sql语句,根据字段增长是额外添加的,原数据库中没有
[/Quote]
如果有主鍵列
可以根據主鍵列修改
  • 打赏
  • 举报
回复
soliddream66 2009-01-14
3楼,很精妙,学习了

问题是如果cnt不是tb的一个字段呢,条件里面的cnt<=t.cnt该如何改呢?

我程序里面调用的sql语句,根据字段增长是额外添加的,原数据库中没有
  • 打赏
  • 举报
回复
水族杰纶 2009-01-14
set nocount on
if object_id('tb')is not null drop table tb
go
create table tb( ID int)
insert tb select 1
insert tb select 1
insert tb select 1
insert tb select 2
insert tb select 2
insert tb select 3
alter table tb
add cnt int identity
go
select id ,cnt=(select count(*) from tb where id=t.id and cnt<=t.cnt) from tb t
go
alter table tb
drop column cnt
/*id cnt
----------- -----------
1 1
1 2
1 3
2 1
2 2
3 1*/
  • 打赏
  • 举报
回复
soliddream66 2009-01-14
我是在程序里面调用sql语句唉~

而且这条语句只是一条很长的语句里面的一个子句啊
  • 打赏
  • 举报
回复
nalnait 2009-01-14

--十进制转为十六进制

DECLARE
@binary varbinary(255),
@str_return varchar(255)

SELECT
@binary = CONVERT(varbinary(255),29327795562177529)


EXEC master.dbo.xp_varbintohexstr @binary, @str_return OUTPUT
SELECT
结果 = reverse(@str_return)

/*
结果
__________________________
008613974878369F10000011x0
*/

--十六进制转为十进制
CREATE FUNCTION dbo.f_hex_dec(@s varchar(16))
RETURNS bigint
AS
BEGIN

--参数不得含'0'~'9'、'a'~'f'、'A'~'F'之外的任意字符(首尾空格除外),否则返回0
DECLARE @i int,@result bigint
SELECT @i=0,@result=0,@s=RTRIM(LTRIM(UPPER(REVERSE(@s))))
WHILE @i<LEN(@s)
BEGIN
IF SUBSTRING(@s,@i+1,1) not between '0' and '9' and SUBSTRING(@s,@i+1,1) not between 'A' and 'F'
BEGIN
SELECT @result=0
break
END
SELECT @result=@result+(CHARINDEX(SUBSTRING(@s,@i+1,1),'0123456789ABCDEF')-1)*POWER(16,@i),@i=@i+1
END
RETURN @result
END
GO
  • 打赏
  • 举报
回复
相关推荐
发帖
MS-SQL Server
加入

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2009-01-14 01:51
社区公告
暂无公告