SQL Server插入多行并递增整数列

3
我有一些表格中的行需要转移到另一个表格中。在目标表格中,我还需要添加一个带有递增值的字段。
我正在进行以下操作,但我知道插入操作中有些问题,因为递增值(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)

我已经从旧表中获取了所需的所有行,并将其增量值迁移到新表中。


如果您使用 IDENT_CURRENT,那意味着该表上有一个 IDENTITY 列;只需不在列列表中指定该列并且不插入任何值到该列 - 当发生 INSERT 时,IDENTITY 列将自动获得一个新的唯一值... - marc_s
4个回答

3

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

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

第二种解决方案是将目标表中的该列设置为 identity


很遗憾,目标表中已经存在一个带有IDENTITY的列。 - Filipe Costa
寻找一种方法,将该列的值用作intCodInterno列的值,类似于持久化计算列或... - Jahan Zinedine

3

删除intCodInterno部分,在SQL Server中使用Identity属性来自动增加它。


3

IDENT_CURRENT在事务提交之前不会更新,因此其值保持不变,直到您插入数据。

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

  1. 使用某种计数器(@newRowNum),使得对于查询中的每一行,@newRowNum = @newRowNum +1,从而您的intCodInterno编号= IDENT_CURRENT() + @newRowNum。但这可能需要大量修改才能正常工作,不建议使用。

  2. 按照现有的业务逻辑顺序插入行 - 这将极大地降低性能,不建议使用。

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

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


0
在我的情况下,我使用相同的业务逻辑按顺序插入行。我不能使用自动增量,因为我还必须将旧数据导入到此列中。一旦您导入了数据,就可以更新该列以进行自动增量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接