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 列的主要内容,如果未能解决你的问题,请参考以下文章