Sql server 2008 SQL server插入多行并递增一个int列

Sql server 2008 SQL server插入多行并递增一个int列,sql-server-2008,auto-increment,Sql Server 2008,Auto Increment,我在一个表中有一些行,需要将它们转移到另一个表中。在目标表中,我还需要添加一个具有增量值的字段 我正在执行以下操作,但我知道insert中有错误,因为递增的值(intCodInterno)总是相同的: 我需要更改什么以使值正确递增 多谢各位 编辑: 我在查询中做了一个小改动,现在它可以工作了。 我只需在括号内的当前标识中插入一个SELECT: (SELECT IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1) 我用递增的值从旧表到新表获得了所需的

我在一个表中有一些行,需要将它们转移到另一个表中。在目标表中,我还需要添加一个具有增量值的字段

我正在执行以下操作,但我知道insert中有错误,因为递增的值(intCodInterno)总是相同的:

我需要更改什么以使值正确递增

多谢各位

编辑:

我在查询中做了一个小改动,现在它可以工作了。 我只需在括号内的当前标识中插入一个SELECT:

(SELECT IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1)
我用递增的值从旧表到新表获得了所需的所有行

当前标识('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1 当您想要运行查询时,计算一次,所有行都将获得相同的id

第一种解决方案是通过循环构造(如游标或其他)在select结果上迭代,然后插入递增的索引(您可以这样做)


第二种解决方案是使目标表中的该列
identity

使用intCodInterno删除该部分,并在SQL Server中使用自动递增

IDENT_CURRENT在事务提交之前不会更新,因此它的值在插入之前保持不变

以下是解决此问题的三个选项:

  • 使用某种类型的计数器(@newRowNum),以便对于SELECT查询中的每一行,@newRowNum=@newRowNum+1,因此您的intCodInterno number=IDENT_CURRENT()+@newRowNum。不过,这可能需要大量的黑客操作。不要推荐它

  • 使用与现在相同的业务逻辑按顺序插入行-但是性能会大大降低。不要推荐它

  • 将目标表中的该列本身设置为标识列。这是目前为止最好的方法


  • 如果您需要自定义标识函数(我假设您现在不使用标识列是有原因的),您可以使用上面概述的一些步骤创建一个:

    在我的示例中,我使用相同的业务逻辑按顺序插入行。我不能使用自动增量,因为我还必须将旧数据导入此列。导入数据后,您可以更新列以进行自动增量。

    如果您使用
    IDENT_CURRENT
    ,则表示该表上有
    IDENTITY
    列;只是不要在列列表中指定该列,也不要向其插入任何值-插入时,
    IDENTITY
    列将自动获得一个新的唯一值…不幸的是,目标表中已经存在一个具有IDENTITY的列。请寻找将该列的值用作intCodInterno列的值的方法,某事物,如计算列或。。。
    (SELECT IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1)