【问题标题】:SQL Set IDENTITY Field Using VariableSQL 使用变量设置 IDENTITY 字段
【发布时间】:2012-07-22 17:10:30
【问题描述】:

所有,我想根据从另一个表获得的当前最大值开始对IDENTITY 字段的编号。所以我尝试了类似以下的方法

DECLARE @CurrentES INT;
SET @CurrentES = (SELECT MaxES 
                  FROM [NDB]..[TmpMaxES]) + 1;
ALTER TABLE BA 
ADD ES INT IDENTITY(@CurrentES, 1);

但这不会接受变量作为 IDENTITY 中的种子值。怎样才能达到我的要求?

感谢您的宝贵时间。

【问题讨论】:

    标签: sql-server-2008 tsql dynamic-sql identity-column


    【解决方案1】:
    --first variable 
        declare @code varchar(50);
        set @code=1345688867567576;
    --second variable
        declare @namedb varchar(50);
        set @namedb='test';
    --let's you add to the identity(ID) field           
        SET IDENTITY_INSERT dbo.nameAndroid ON
    --declaring variable to hold the next id number
        declare @id int;
        set @id=@@IDENTITY +1;
    --clause to check if the table has the matching barcode 
        if not exists (select * from dbo.nameAndroid where barcode = @code)
        INSERT INTO dbo.nameAndroid (id, name, barcode, [floor], Column1,Column2,Row1,Row2,Shelf,Stock,OnOrder)
        VALUES ( @id,@namedb, @code, 'Value3', 'Value4','Value5','Value6','Value7','Value8',123,600);
    
        SET IDENTITY_INSERT dbo.nameAndroid OFF;
    

    OR(如果 id 列是 int 类型)

        declare @code varchar(50);
        set @code='123211';
    
        declare @namedb varchar(50);
        set @namedb='test';
    
        declare @floordb varchar(50);
        set @floordb='test';
    
        declare @Column1db varchar(50);
        set @Column1db='test';
    
        declare @Column2db varchar(50);
        set @Column2db='test';
    
        declare @Row1db varchar(50);
        set @Row1db='test';
    
        declare @Row2db varchar(50);
        set @Row2db='test';
    
        declare @Shelfdb varchar(50);
        set @Shelfdb='test';
    
        declare @OnOrderdb decimal(18,2);
        set @OnOrderdb=10010;
    
        declare @Stockdb decimal(18,2);
        set @Stockdb=1010101;
    
        declare @id int;
       set @id=((select max(id) from dbo.nameAndroid )+1);
    
    
    
    if not exists (select * from dbo.nameAndroid where barcode = @code)
    
      begin
    SET IDENTITY_INSERT dbo.nameAndroid ON;
    
        INSERT INTO dbo.nameAndroid (id, name, barcode, [floor], Column1,Column2,Row1,Row2,Shelf,Stock,OnOrder)
        VALUES (@id, @namedb, @code, @floordb, @Column1db,@Column2db,@Row1db,@Row2db,@Shelfdb,@OnOrderdb,@Stockdb);
    
    SET IDENTITY_INSERT dbo.nameAndroid OFF;
    end
    

    【讨论】:

    • 您应该使用scope_identity() 而不是@@IDENTITY,后者不属于您的脚本,因此可能会产生意想不到的结果
    【解决方案2】:

    您可以使用 SQL Server 的dbcc checkident 功能...

    DECLARE @MAXID INT
    SELECT @MAXID = MAX(ID_FIELD) FROM OLDTABLE
    dbcc checkident(NEWTABLE, reseed, @MAXID)
    

    需要注意的一点是,第三个参数中的值(在本例中为 @MAXID 变量)表示 当前 标识值 - 换言之,生成的最后一个标识值在桌子上。

    因此,例如,如果您希望自动创建的 next 值为100,则将第三个参数设置为99

    【讨论】:

    【解决方案3】:

    做这个和其他不可变允许的任务,可以使用EXEC函数,如下:

    DECLARE @CurrentES INT;
    SET @CurrentES = (SELECT MaxES 
                      FROM [NDB]..[TmpMaxES]) + 1;
    
    DECLARE @Statement VARCHAR(200)
    
    SET @Statement = 'ALTER TABLE BA 
    ADD ES INT IDENTITY(' + CAST(@CurrentES AS VARCHAR) + ', 1);'
    
    EXEC (@Statement)
    

    【讨论】:

    • 应尽可能避免使用动态 SQL。在这种情况下,freefaller 提出了一个非动态替代方案
    【解决方案4】:

    试试这样的..

    SET IDENTITY_INSERT [MyTable] ON
    INSERT INTO [MyTable] ... (MAX) Value from another table and other applicable record.
    ...
    SET IDENTITY_INSERT [MyTable] OFF
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-26
      • 2018-11-08
      • 2015-03-25
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 2020-04-17
      相关资源
      最近更新 更多