SQL Server 插入多行并增加一个 int 列

Posted

技术标签:

【中文标题】SQL Server 插入多行并增加一个 int 列【英文标题】:SQL server insert multiple rows and incrementing a int column 【发布时间】:2011-05-31 06:36:33 【问题描述】:

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

我正在执行以下操作,但我知道插入中的某些内容是错误的,因为递增的值 (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 列;只是不要在列列表中指定该列,也不要向其中插入任何值 - IDENTITY 列将在 INSERT 发生时自动获得一个新的唯一值.... 【参考方案1】:

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

第一个解决方案是通过像游标这样的循环构造来迭代选择结果,然后插入递增的索引(你这样做)

第二种解决方案是将该列放入目标表identity

【讨论】:

很遗憾,目标表中已经存在 IDENTITY 列。 寻找一种方法将该列的值用作 intCodInterno 列的值,例如持久计算列或 ...【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于SQL Server 插入多行并增加一个 int 列的主要内容,如果未能解决你的问题,请参考以下文章

Sql-Server用insert插入多行数据-语法和例子

插入后使用触发器更新多行(sql server)

如何在 SQL Server 中插入多行?

插入行并增加字段中的值

在 Sql Server 中插入或更新多行

如何在 SQL Server CE 数据库中插入多行? [关闭]