SQL Server插入多行并递增int列

问题描述 投票:3回答:4

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

我正在做以下,但我知道插入中的某些内容是错误的,因为递增的值(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)

我通过递增的值获得了从旧表到新表所需的所有行。

sql-server-2008 auto-increment
4个回答
3
投票

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

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

第二个解决方案是在目标表identity中创建该列


3
投票

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


3
投票

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

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

  1. 使用某种计数器(@newRowNum),这样对于SELECT查询中的每一行,@ newRowNum = @newRowNum +1,因此你的intCodInterno数字= IDENT_CURRENT()+ @ newRowNum。这可能需要大量的黑客才能工作。不推荐它。
  2. 使用您现在使用的相同业务逻辑顺序插入行 - 但是,它的性能将大大降低。不推荐它。
  3. 将目标表中的该列设置为标识列本身。这是迄今为止最好的方法。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.