我在表中有一些行,需要将它们传输到另一个表。在目标表中,我还需要添加一个具有增量值的字段。
我正在执行以下操作,但我知道插入中的某些内容是错误的,因为递增的值(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)
我从旧表中获得了所有需要增加值的新行。
答案 0 :(得分:3)
IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1
在您想要运行查询时评估一次,并且所有行都将获得相同的ID。
第一个解决方案是通过循环结构(如光标或其他任意方式)迭代选择结果并插入递增的索引(您这样做)
第二个解决方案是在目标表identity
答案 1 :(得分:3)
使用intCodInterno删除部件,在SQL Server中使用Identity property自动为您增加部分。
答案 2 :(得分:3)
IDENT_CURRENT在事务提交之前不会更新,因此在插入之前它的值保持不变。
以下是解决此问题的三个选项:
使用某种计数器(@newRowNum),这样对于SELECT查询中的每一行,@ newRowNum = @newRowNum +1,因此你的intCodInterno数字= IDENT_CURRENT()+ @ newRowNum。这可能需要大量的黑客才能工作。不推荐它。
使用您现在拥有的相同业务逻辑顺序插入行 - 但是,它的性能将大大降低。不推荐它。
将目标表中的该列设置为标识列本身。这是目前最好的方法。
如果您需要自定义身份功能(我假设您之前没有使用身份列的原因),您可以使用上面列出的一些步骤创建一个:http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server
答案 3 :(得分:0)
就我而言,我使用相同的业务逻辑顺序插入行。我不能使用自动增量,因为我必须将旧数据也导入此列。导入数据后,您可以更新自动增量列。