• 全部
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发
  • 问答

SQL Server2000中是否有 Oracle中的 序列 的概念

wt_sanlian 2007-04-11 08:12:03
rt
...全文
217 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
痞子酷 2007-04-13
局域网:
客户端唯一标识有代表性的有:
1。IP:16进制,8个字符
2。登陆用户名ID:一般登陆名是唯一的。
回复
wt_sanlian 2007-04-12
呵呵,

”如果有事务时和回滚时麻烦,导致异常问题“ 可以展开说一下吗?

如果用客户端唯一标识的话,客户端唯一标识应存储在什么地方呢,

回复
痞子酷 2007-04-12
这种方法不好,如果有事务时和回滚时麻烦,导致异常问题。
最好的每一个客户端都要定义唯一行标识。进程根据唯一标识很容易获得唯一序列。
比如:
客户端唯一行标识+YYMMDDHHMI+进程定义的循环序列。
回复
wt_sanlian 2007-04-12
上网上查了一下,就是自已建立一个表,有一个字段叫KeyName,另一个叫KeyVal
KeyVal 用于保存最新值,获取新的ID时用下面的方法:

declare @keyName varchar(64)
declare @keval int
set @keyname = 'mykey'
update MyKeyTable Set @keyval = keyval = keyval + 1 where keyname = @keyname
select @keyval as newkey

对@keyval 赋值是在一个Update语句中进行的,Update执行在SQL 中应当是原子性的吧!
个人觉得这种方法可以避免多客户端同时生成主键冲突的问题,
大虾们,有没有什么不同观点
回复
wt_sanlian 2007-04-11
谢谢三十年孤独及我又...
我不想用IDENTITY,主键想自已定义成字符型的,但有多个客户端可能同时对表进行插入,
如果SQL Server 中要有象Oracle中的序列的话就可以解决主键冲突,可SQLServer中好象没有这种东西
回复
sczyq 2007-04-11
INT NOT NULL IDENTITY
回复
chpst 2007-04-11
lgjf
回复
我不懂电脑 2007-04-11
IDENTITY 和 SEQUENCE

Sql Server中,定义一个列为递增列很容易,但我在Oracle中却怎么也找不到设置的方法。不过查了点资料后知道Oracle中有个叫Sequence的对象,产生一个唯一的序列号,类似于Sql Server中的IDENTITY。于是,我做了如下实验:



首先,在Oracle中创建了一个名为TEST_SEQ的Sequence对象,SQL语句如下:

create sequence TEST_SEQ

minvalue 100

maxvalue 999

start with 102

increment by 1

nocache;



语法应该是比较易懂的,最小最大值分别用minvalue,maxvalue表示,初始值是102(这个数字是动态变化的,我创建的时候设的是100,后因插入了2条数据后就自动增加了2),increment当然就是步长了。在PL/SQL中可以用test_seq.nextval访问下一个序列号,用test_seq.currval访问当前的序列号。



定义完了Sequence,接下来就是创建一个存储过程InsertRecordWithSequence:

--这次我修改了test表的定义,和前面的示例不同。其中,UserID是PK。

create or replace procedure InsertRecordWithSequence(UserID out number,

UserName in varchar2,

UserAge in number)

is

begin

insert into test(id, name, age) --插入一条记录,PK值从Sequece获取

values(test_seq.nextval, UserName, UserAge);

/**//*返回PK值。注意Dual表的用法*/

select test_seq.currval into UserID from dual;

end InsertRecordWithSequence;



接下来,就是在C#中进行调用了:

string connectionString = "Data Source=YXZHANG;User ID=YXZHANG;Password=YXZHANG";

string queryString = "InsertRecordWithSequence";

OracleConnection cn = new OracleConnection(connectionString);

OracleCommand cmd = new OracleCommand(queryString,cn);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("UserID",OracleType.Number);

cmd.Parameters["UserID"].Direction = ParameterDirection.Output;

cmd.Parameters.Add("UserName","Jack");

cmd.Parameters.Add("UserAge",40);



try

{

cn.Open();

int rowAffected = cmd.ExecuteNonQuery();

Console.WriteLine("{0}行已插入。",rowAffected);

Console.WriteLine("插入行的ID为:{0}",cmd.Parameters["UserID"].Value.ToString());

cn.Close();

}

catch( OracleException ex )

{

Console.WriteLine("Exception occurred!");

Console.WriteLine("The exception message is:{0}",ex.Message.ToString());

}

finally

{

Console.WriteLine("------------------End-------------------");

}

小结:

使用Sequece对象可以很容易地创建唯一序列,在存储过程中的调用也十分方便,只要sequence_name.nextval以及sequence.currval就能得到下一个以及当前的序列值。倒是Dual表值得注意。
回复
痞子酷 2007-04-11
SQL Server2000中是否有 Oracle中的 序列 的概念
------------------------------
可以说无。
oracle sequence 非常好用。
SQL Server2000 IDENTITY不好用。

我记得SQL Server最初序列我是这样处理的。这是很多年以前的事啦。
客户端唯一标识+日期时间+加上进程自定义的递增序列。
呵呵~~~
回复
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2007-04-11 08:12
社区公告
暂无公告