代码之家  ›  专栏  ›  技术社区  ›  TGnat

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

  •  5
  • TGnat  · 技术社区  · 15 年前

    我需要创建一个带有标识种子的表变量,该种子从另一个表中某个字段的最大值开始?

    我试过这个:

    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 回复  |  直到 15 年前
        1
  •  11
  •   Michael Myers KitsuneYMG    9 年前

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

    DBCC CHECKIDENT (#HH)
    

    您也可以在以后使用以下方法更改:

    DBCC CHECKIDENT (#HH, RESEED, 42)
    

    这也适用于新值的变量:

    DBCC CHECKIDENT (#HH, RESEED, @IdentitySeed)
    

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

    很抱歉,似乎无法使用表变量执行此操作。。。。。

        2
  •  5
  •   Gabriel G    11 年前

    我最后做了以下几件事:

    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'
    

    非常感谢。

        3
  •  3
  •   dcpking    15 年前

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