以编程方式在表变量中设置标识种子

时间:2009-08-26 15:29:05

标签: sql-server

我需要创建一个表变量,其标识种子以另一个表中字段的最大值开头?

我试过这个:

DECLARE @IdentitySeed int

SET @IdentitySeed = (SELECT MAX(HHRecId) +1 FROM xxx )

DECLARE @HH TABLE (
    HHId INT IDENTITY(@IdentitySeed,1)
    ,AddressType CHAR(1)
    ,Address1 VARCHAR(100)
    ,City VARCHAR(50)
    ,State VARCHAR(2)
    ,Zip VARCHAR(5)
    ,LastName VARCHAR(50)
    )

但是这会产生语法错误。

现在,我已经在表变量中添加了另一个int列,并使用identity列和@IdentitySeed的总和来更新它,但是我希望找到一种方法,在没有更新的情况下执行此操作。

3 个答案:

答案 0 :(得分:8)

您可以使用以下方法检查IDENTITY列的当前值:

DBCC CHECKIDENT (#HH)

您也可以稍后使用以下内容进行更改:

DBCC CHECKIDENT (#HH, RESEED, 42)

并且它也适用于新值的变量:

DBCC CHECKIDENT (#HH, RESEED, @IdentitySeed)

它适用于本地和全局临时表(即CREATE TABLE #HH (...)CREATE TABLE ##HH (....) - 但它似乎不适用于表变量: - (

抱歉,您似乎无法使用表变量.....

答案 1 :(得分:3)

我相信你可以做到这一点,但它必须在动态SQL中完成 - 在动态SQL中声明tableVar并在那里使用它!

如果您从1开始并且具有计算为MAX(HHRecId)+ ID的辅助ID字段,那肯定会更容易并且会产生更快的代码。

答案 2 :(得分:2)

我最终做了以下事情:

DECLARE @NewId INT

SELECT @NewId = MAX(ID) FROM MyIDSTable

DECLARE @MyTempData TABLE (
    Id int not null primary key
    ,Field1 int not null
    ,Field2 nvarchar(25) not null
    ,Field3 datetime
)

INSERT INTO @MyTempData
SELECT  ROW_NUMBER() OVER ( Order by [C].[Cancel_id] ASC) + @NewId -1 [RowNum]
        ,Field1
        ,Field2
        ,Field3

INSERT INTO MyTable SELECT * FROM @MyTempData

UPDATE MYIDSTable SET ID = (SELECT MAX(ID) FROM @MyTempData) + 1 WHERE Name = 'Something'

谢谢