安全tsql编号int技术

时间:2015-09-30 15:47:22

标签: sql-server tsql numbers

Hello stackOverflowers!

我想知道是否有一种安全的方式,交易中的一系列数字就像身份一样。我的唯一目的是对表中的行进行分组,我不是指row_number()。 我想出了这个简单的查询,这样安全吗? 此表有自己的标识密钥

declare @mynextSecuenceNumber int
    select @mynextSecuenceNumber=isnull(max(secuencenumber+1),1) from mytable
insert into mytable (productID,customer,secuencenumber) values (@someval,@anotherval,@mynextSecuenceNumber)

修改

背景

这样做的原因是下一个:

首先我收到用于汽车服务的汽车配件然后我为此接收生成一张票(我可以收到一个,两个,三个汽车零件)以后我可以继续从同一个汽车零部件提供商处回收特定汽车服务的汽车零部件或者来自不同的提供商,但我希望能够重新生成事件或票证,否则我将最终查询服务和与该提供商或提供商相关的所有汽车配件,我不会知道我在那里收到的事件操作,除此之外,我还需要与该汽车服务相关的所有汽车配件的另一个特定ID。

顺便说一句,我在sql server 2008上

抬头

使用身份作为secuence数字可能是凌乱的cus交易将在回滚后增加值和其他issues所以要注意这一点,由于这个方法作为我的acepass答案我可以找到另一种相处的方式交易首先出现在链接上

1 个答案:

答案 0 :(得分:1)

当SQL 2012或更高版本不是一个选项时,这是Microsoft提供的可扩展建议,但您需要管理目标表中没有标识的序列号。这创建了一个单独的表来跟踪序列号,让我们的身份做一些繁重的工作,并通过清理使表格大小保持最小。如果此负载变得太大,您可以在非高峰时间安排一些清理工作。

-- Create table for tracking the sequence
create table <tablename> (
      SeqID int identity(1,1) primary key
)
GO

-- Create procedure to return next sequence value
create procedure GetNewSeqVal_<tablename>
    @NextValue int output
as
begin
    declare @NewSeqValue int
    set nocount on
    insert into <tablename> DEFAULT VALUES
    set @NewSeqValue = scope_identity()
    delete from <tablename> with (readpast)
    set @NextValue = @NewSeqValue
end
go

-- Get next sequence
declare @seqId int
exec GetNewSeqVal_<tablename> @NextValue = @seqId OUTPUT

了解更多信息:http://blogs.msdn.com/b/sqlcat/archive/2006/04/10/sql-server-sequence-number.aspx