有没有办法我可以为使用存储过程插入的表创建唯一的Id而不使用Identity

时间:2014-07-09 18:25:57

标签: sql-server

我有一个像这样定义的表:

CREATE TABLE [dbo].[Test] (
    [TestId]  INT IDENTITY (1, 1) NOT NULL,
    [Title]   VARCHAR (100) NOT NULL,
    ....

当我的应用程序制作测试副本以便用户可以使用它时,它使用存储过程来执行此操作。这是我在该存储过程中的缩短版本。

INSERT INTO dbo.Test
 (Title, ....)

SELECT  Title, ....
FROM    Test
WHERE   TestId = @TestId;

那么例如一个TestId为200的表 可能有一个拷贝,使用225的TestId或身份序列中接下来的任何数字。

我想这样做,以便我现在可以控制创建TestId。我仍然希望它当然是独一无二的,但对于副本,我希望像TestId 200这样的东西在复制时变成200-1。

有人可以给我一个建议 至于如何在我的存储过程而不是使用身份中为TestId生成唯一的数字。我知道 Oracle有序列,但SQL Server有这样的东西,我该如何使用 他们在存储过程中?

2 个答案:

答案 0 :(得分:0)

SQL Server有序列(从sql 2012开始)。

http://msdn.microsoft.com/en-us/library/ff878091.aspx

您也可以使用身份。

http://msdn.microsoft.com/en-us/library/ms186775.aspx

答案 1 :(得分:0)

您可能不希望按照您的建议做所需的解决方案。这可能是一个更好的解决方案。

CREATE TABLE TEST
(
   TestID int identity(1,1) not null
,  OriginalID int not null
,  MoreStuff ...

   primary key (NewID)
)

你可能也想要一个关于OriginalID的索引

在你的过程中

Insert Into TEST (OrginalID, MoreStuff ...)
select TestID, MoreStuff ..
from Test from where TestID = @ID

现在您有一个基于原始测试的新测试。您仍然可以根据OriginalID返回原始版本。

ADDED

这可以避免您原始建议所需的有些混乱的逻辑。现在,如果每个“基础”测试用例必须有序列1,2,3,您当然可以遵循原始建议(或内部序列号的单独列)。但除非你被迫这样做,否则不要这样做。