SQL Server 2000如何生成序列

whatwherewhyhow 2009-06-30 03:56:12
需要一个函数,类似SQL Server 2005中的ROW_NUMBER(),调用它能自动产生序列,每次从1开始.例如function seq


SELECT dbo.seq() from tbl


如果tbl中有3条数据,则显示
1
2
3

不借助类似临时表之类
...全文
528 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
whatwherewhyhow 2009-07-23
  • 打赏
  • 举报
回复
Up. 请教这个函数如何实现,
论文MVP网 2009-07-02
  • 打赏
  • 举报
回复
我晕到 你不在SQL中写 不就OK了 用编程的语言写可以吗? 直接 截取BH后面的数字然后转换 然后再加 然后再组合?
jinjazz 2009-06-30
  • 打赏
  • 举报
回复
哦,没看清是2000,只能用子查询了.或者自己写扩展函数,不过2000写扩展比较麻烦
jinjazz 2009-06-30
  • 打赏
  • 举报
回复
已经是sqlserver,干嘛还要类似发明
ai_li7758521 2009-06-30
  • 打赏
  • 举报
回复
貌似lz的函数不容易写。帮顶
whatwherewhyhow 2009-06-30
  • 打赏
  • 举报
回复
up,准备放弃了
whatwherewhyhow 2009-06-30
  • 打赏
  • 举报
回复
up,准备放弃了
whatwherewhyhow 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhengduan964532 的回复:]
那是否考虑并发会产生的一些影响..
[/Quote]
zhengduan964532 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 whatwherewhyhow 的回复:]
引用 6 楼 fredrickhu 的回复:
问哈,你那个insert into tablename default values
tablename 是临时表么

[/Quote]

那个不是临时表,临时表是带#号的如果关闭了sql那么临时表就会小时,使用的不带#的,不是临时表
whatwherewhyhow 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fredrickhu 的回复:]
问哈,你那个insert into tablename default values
tablename 是临时表么
[/Quote]
whatwherewhyhow 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fredrickhu 的回复:]
问哈,你那个insert into tablename default values
tablename 是临时表么
[/Quote]
JonasFeng 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhengduan964532 的回复:]
SQL codecreatetable tablename(idintidentity(1,1))select*from tablename
[/Quote]

正解。
zhengduan964532 2009-06-30
  • 打赏
  • 举报
回复
create table tablename(id int identity(1,1))
select * from tablename
--小F-- 2009-06-30
  • 打赏
  • 举报
回复
create table tablename(id int identity(1,1))
go
insert into tablename default values
go
select * from tablename
go
drop table tablename
go
--小F-- 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 whatwherewhyhow 的回复:]
需要一个函数,类似SQL Server 2005中的ROW_NUMBER(),调用它能自动产生序列,每次从1开始.例如function seq

SQL codeSELECT dbo.seq()from tbl

如果tbl中有3条数据,则显示
1
2
3

不借助类似临时表之类
[/Quote]
........
--难道就这样就 OK了 ?
create table tablename(id int identity(1,1))go
insert into tablename default values
go
select * from tablenamegodrop table tablename
go

knifewei 2009-06-30
  • 打赏
  • 举报
回复
SELECT
順位= IDENTITY(int, 1,1)
htl258_Tony 2009-06-30
  • 打赏
  • 举报
回复
SQL Server 2000中是没有这个函数的,那除了迁移数据库版本外,有没有替代的解决方法呢?答案是肯定的。
有两个思路


1、使用临时表。
如果是在存储过程中,这是一个不错的选择。
创建一个临时表,其中除了需要的查询结果外,还一个记数列。查询结果放入临时表后(一般情况下可直接使用Insert into语句),用代码进行记数,更新记数列的值。
在记数列数值的生成方法上,还有一个改进的办法是直接将该列定义为自增长字段。这样“记数”的代码也省掉了。

2、采用自连接。
如果是在代码中,不便于使用临时表,可以采用此方法。比如执行一个查询统计,需要一个替代的SQL语句。
这个方法实际上是通过表的自连接给结果行“分等级”的思路来实现的。
语句如下:
select count(*),e1.ENo, e1.EName
from Employee e1
inner join Employee e2 on e1.ENo >= e2.ENo
group by e1.ENo, e1.EName
order by 1

或者把join条件放到where子句中:
select count(*),e1.ENo, e1.EName
from Employee e1, Employee e2,
where e1.ENo >= e2.ENo
group by e1.ENo, e1.EName
order by 1

如果ENo字段值不重复,还可以这样写:
select (select count(*) from Employee e2 where e1.ENo >= e2.ENo), e1.ENo, e1.EName
from Employee e1
order by 1

如果ENo字段值有重复的情况,要使用最后一种写法可以将where条件变通一下,如:
where e1.ENo+e1.EName >= e2.ENo+e2.EName
总能找到不存在重复值的表达式的。

有关采用自连接方法的进一步解释可以参考《SQL Cookbook》这本书的12.8节。


文章出处:DIY部落(http://www.diybl.com/course/7_databases/database_other/20090207/154905.html)
knifewei 2009-06-30
  • 打赏
  • 举报
回复
identity()函数
whatwherewhyhow 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]
太依赖其它表了,没有可重复利用性
[/Quote] 
--小F-- 2009-06-30
  • 打赏
  • 举报
回复
--参考
在学习中遇到这个问题
数据库里有编号字段
BH00001
BH00002
BH00003
BH00004
如何实现自动增长



--下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号。
--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(8)
AS
BEGIN
RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
END
GO

--在表中应用函数
CREATE TABLE tb(
BH char(8) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)

--插入资料
BEGIN TRAN
INSERT tb(col) VALUES(1)
INSERT tb(col) VALUES(2)
INSERT tb(col) VALUES(3)
DELETE tb WHERE col=3
INSERT tb(col) VALUES(4)
INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)
COMMIT TRAN

--显示结果
SELECT * FROM tb
/*--结果
BH col
---------------- -----------
BH000001 1
BH000002 2
BH000003 4
BH000004 14
--*/



create table tb
(id int identity,
name varchar(10),
code as 'BH'+right('0000'+cast(id as varchar),5))
go
insert tb(name) select 'A'
union all select 'B'
union all select 'C'
union all select 'D'

select * from tb

drop table tb

/*
id name code
----------- ---------- ------------
1 A BH00001
2 B BH00002
3 C BH00003
4 D BH00004

(所影响的行数为 4 行)
*/

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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