SQL Server插入多行并递增int列

时间:2010-12-27 18:56:14

标签: sql-server-2008 auto-increment

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

我正在执行以下操作,但我知道插入中的某些内容是错误的,因为递增的值(intCodInterno)始终是相同的:

INSERT INTO Emp_VISOT.dbo.TBL_GCE_ARTIGOS
        ( strCodigo ,
          strDescricao ,
          intCodInterno ,
          intCodTaxaIvaCompra ,
          intCodTaxaIvaVenda ,
          strCodCategoria ,
          strAbrevMedStk ,
          strAbrevMedVnd ,
          strAbrevMedCmp ,
          bitAfectaIntrastat
        )(
        SELECT  A.Artigo ,
                a.Descricao ,
                IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1,
                '3' ,
                '3' ,
                '1' ,
                'Un' ,
                'Un' ,
                'Un' ,
                '0'
        FROM PRIVESAM.DBO.Artigo A)

我需要更改什么才能使值正确递增?

谢谢。

编辑:

我在查询中做了一些小改动,现在它可以工作了。 我只是在括号内的IDENT_CURRENT中插入一个SELECT:

(SELECT IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1)

我从旧表中获得了所有需要增加值的新行。

4 个答案:

答案 0 :(得分:3)

IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1 在您想要运行查询时评估一次,并且所有行都将获得相同的ID。

第一个解决方案是通过循环结构(如光标或其他任意方式)迭代选择结果并插入递增的索引(您这样做)

第二个解决方案是在目标表identity

中创建该列

答案 1 :(得分:3)

使用intCodInterno删除部件,在SQL Server中使用Identity property自动为您增加部分。

答案 2 :(得分:3)

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

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

  1. 使用某种计数器(@newRowNum),这样对于SELECT查询中的每一行,@ newRowNum = @newRowNum +1,因此你的intCodInterno数字= IDENT_CURRENT()+ @ newRowNum。这可能需要大量的黑客才能工作。不推荐它。

  2. 使用您现在拥有的相同业务逻辑顺序插入行 - 但是,它的性能将大大降低。不推荐它。

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

  4. 如果您需要自定义身份功能(我假设您之前没有使用身份列的原因),您可以使用上面列出的一些步骤创建一个:http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server

答案 3 :(得分:0)

就我而言,我使用相同的业务逻辑顺序插入行。我不能使用自动增量,因为我必须将旧数据也导入此列。导入数据后,您可以更新自动增量列。