使用参数作为IDENTITY起始编号

时间:2014-07-01 19:16:11

标签: sql identity temp-tables

我正在编写一个创建一些测试帐户的查询。我给我的存储过程一个INT作为起始编号 - 并且希望它只创建比之前的编号多1的帐户,因为每个帐号必须不同。我已从表中删除了几乎所有项目,但这是我正在尝试使用的内容:

CREATE TABLE #TempAccount (AccountNumber INT IDENTITY((@StartingAccountNumber), 1)

它给了我一个"错误的语法' @ StartingAccountNumber'。期待'('或SELECT"

一些在互联网上搜索给了我一个潜在的解决方案:

DECLARE @Statement VARCHAR(200)
SET @Statement = 'ALTER TABLE BA 
ADD ES INT IDENTITY(' + CAST(@CurrentES AS VARCHAR) + ', 1);'
EXEC (@Statement)

然而 - 我被告知这不是这个项目的选择。有没有办法以类似于我原来意图的方式注入我的参数?

2 个答案:

答案 0 :(得分:2)

您可以使用DBCC CHECKIDENT来执行此操作。首先创建表,然后使用此命令重新设置它。

CREATE TABLE #TempAccount (AccountNumber INT IDENTITY(1, 1))

Declare @StartingAccountNumber int
SET @StartingAccountNumber = 1000

DBCC CHECKIDENT
(
    #TempAccount, RESEED, @StartingAccountNumber

)

您可以在此处阅读:http://www.techrepublic.com/blog/the-enterprise-cloud/how-do-i-reseed-a-sql-server-identity-column/

答案 1 :(得分:0)

听起来你想做的就是生成一系列单调数字,对吗?

使用包含大量连续整数值的实用程序表通常很有用,如下所示:

create table dbo.sequence ( id int not null primary key clustered )
go

set nocount on
go
declare @n  int = -1000000 
while ( @n < +1000000 )
begin
  insert dbo.sequence values ( @n )
  set @n = @n+1
end
go
set nocount on
go

你只需要做一次。一旦你有了这样的资源,事情就变得容易了:

CREATE TABLE #TempAccount ( AccountNumber int primary key clustered )

declare @starting_account_number int = 123456789
declare @count                   int = 10000

insert #TempAccount ( AccountNumber )
select @starting_account_number + offset.id
from dbo.sequence offset
where offset.id between 0 and @count-1