网站首页  |   业界社区  |  电信社区  |  技术社区   |  极客社区  |  游戏社区  |  生活社区   |   科技博客  |   同事录
TechWeb-技术社区


标题: 棘手的问题:如何返回一个不重复的id值?
本主题由 xufeng 于 2008-7-31 11:44 移动
过桥的鱼
TW高级会员
Rank: 4


UID 117313
精华 12
积分 754
帖子 403
阅读权限 50
注册 2007-3-29
状态 离线
发表于 2008-7-28 11:28 资料 短消息 加为好友
棘手的问题:如何返回一个不重复的id值?

棘手的问题:如何返回一个不重复的id值?, (U$v2p&\3s0K)X
注意:是返回不重复的id值,不要用存储过程,请用函数实现 -Q6e1H$g2y'Y'a0c5?
假设函数名是gen_id(), 4j)N4?*i,s
如果第1次执行select gen_id(),返回一个id值
,c3G(H6P&V |%C7q如果第2次执行select gen_id(),返回一个id值
!q(^8T*x.[#^/`$M……
-T;L3f-G8R `9H0T但每次返回的id都不能和前面的相同,用存储过程可以实现,
]&c*X;A;M3}%`4M但是无法在“select dbo.gen_id(),* from 表”中使用,所以请用函数实现
8['p9~9w/Y,p3{4X下面是我写的脚本,但是调用时不能通过,为何???
%I"n3l O"u([TechWeb-技术社区--
)_+o)v/m1J%W5{/~:uif object_id('rid_table')>0 drop table rid_table
*C6X4?)Q0x&ngo
'N#[!o'i0i!N*r程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛create table dbo.rid_table (rid_id int identity(1,1)) tech.techweb.com.cn!A9J-t3L(e2D#q/u
go
)q2B G8M.J'T+H5^程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛-- tech.techweb.com.cn/k W1I$\6S0e
if object_id('rid_insert_row')>0 drop proc rid_insert_row &^5c6B*H o+L:k
go 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛)z.H3v7q8d7Y(B
create proc rid_insert_row -r2L \+W&|$W P3q
as 1b/S#^7C'p1b1N:r h5`
insert into rid_table default values 5G&Q0A6S5S(H)j P
-- 9o(h(P/g8d1s!c3Y*x
go
7O-`/S.k.x0v%S8B/d*\程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛if object_id('gen_id')>0 drop function gen_id 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛2A#T%L3s6T#o:~;~+z%Q*T
go
7R-j%Q7_#r6e0aTechWeb-技术社区create function dbo.gen_id()
"?3X,C!k8O1S'creturns int *~;j:H7o4J$a&b1X Z
as
4b%U6u4X:i1_8F:N!OTechWeb-技术社区begin .V;r1p!p4`4A)b
declare @r int
4x!|!v W+d;m2G2Ztech.techweb.com.cnexec rid_insert_row 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛.~4u#?7u7\:U
select @r=ident_current('rid_table') 5{%B+Z&B6p/b#[
return @r }+h:_%k"i%w1F#K7i
end
E/c-{#|5V2V I#q-- 1L4Z2q*v b D*P/I
go tech.techweb.com.cn6x'E-m8I;y9a3h.F
select dbo.gen_id(),* from master.dbo.systypes

引用 回复 顶部
游客
未注册









发表于 2008-8-20 15:55
select NewID(),* from master.dbo.systypes

有个系统自带的吧

引用 回复 顶部
游客
未注册









发表于 2008-8-20 15:55
SQL code
SELECT isnull(@@identity,0)+1
SELECT max(isnull(id,0))+1 from @tb
SELECT NEWID()

引用 回复 顶部
游客
未注册









发表于 2008-8-20 15:56
SQL code

select abs(checksum(NewID())),* from master.dbo.systypes



这样就是数值了

引用 回复 顶部
游客
未注册









发表于 2008-8-20 15:56
exec rid_insert_row  是什么东西呢 ??

引用 回复 顶部
游客
未注册









发表于 2008-8-20 15:56
数据量大的话,千万不要用 newid(),效率低得惊人

引用 回复 顶部
游客
未注册









发表于 2008-8-20 15:57
newid()可以实现但是是varchar,我要的是int

@@identity肯定不行,我要在
select dbo.gen_id(),* from master.dbo.systypes 中使用

引用 回复 顶部
游客
未注册









发表于 2008-8-20 15:59
函数改成


SQL code

create function dbo.gen_id()
    returns int
as
begin
    declare @r int
    insert into rid_table default values
    select @r=@@identity --ident_current('rid_table')  @@identity
    return @r
end

引用 回复 顶部
游客
未注册









发表于 2008-8-20 16:00
因为函数中不能使用insert语句,所有改用存储过程来实现
其实这样也不行,看来函数实现不了

引用 回复 顶部
游客
未注册









发表于 2008-8-20 16:00
不行,因为函数中不能使用insert语句
Invalid use of 'INSERT' within a function.

引用 回复 顶部
查看积分策略说明快速回复主题
选项 标题 Smilies
禁用 URL 识别
禁用 Smilies
禁用 Discuz!代码
使用匿名发帖
使用个人签名
接收新回复邮件通知
内容





当前时区 GMT+8, 现在时间是 2008-12-3 07:28
京ICP证060517号

本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0 © 2001-2008 Comsenz Inc.
Processed in 0.044721 second(s), 9 queries

清除 Cookies - 联系我们 - TechWeb.com.cn - Archiver - WAP