我已经阅读了以下答案,一旦创建为常规int,就无法将列更改为identity。
Adding an identity to an existing column
How to Alter a table for Identity Specification is identity SQL Server
How to alter column to identity(1,1)
但问题是我有一个表已经迁移到一个新的表,其中ID从一开始就没有被声明为身份,因为很久以前用ID身份创建的旧表缺少行到期清除历史数据。据我所知,如果我在新表上添加一个新列作为标识,它将自动按顺序创建列,我需要保留旧表中的ID,因为已经有数据链接到这些的ID。
如何将我的ID列从新表中转换为标识但不按顺序转换,但是使用旧表中的ID?
答案 0 :(得分:4)
您可以尝试这种方法:
SET IDENTITY_INSERT <new table> ON
插入旧ID的行。这允许您插入自己的ID。DBCC CHECKIDENT ('<new table>', RESEED, <max ID + 1>)
的最高ID值+1 。这将允许您的身份从最高ID和向前增加。 代码中有这样的东西:
-- Disable auto increment
SET IDENTITY_INSERT <new table> ON
-- <INSERT STUFF HERE>
SET IDENTITY_INSERT <new table> OFF
-- Reseed Identity from max ID
DECLARE @maxval Int
SET @maxval = ISNULL(
(
SELECT
MAX(<identity column>) + 1
FROM <new table>
), 0)
DBCC CHECKIDENT ('<new table>', RESEED, @maxval)
编辑:当然,这种方法需要你的ID列和身份。
答案 1 :(得分:0)
如果您要在先前版本中复制的字段中没有空值,则可以通过执行最大(Id)选择来首先找出最大ID。然后使用SSMS添加新字段,当您将其设置为标识时,只需将SEED值设置为高于当前最大值的值,这样您就不会在新插入上发生冲突。
答案 2 :(得分:0)
我有一个过程,其中在源文件,CSV和生产表之间使用了临时表。临时表必须与CSV文件列匹配,此数据中没有PK。
要在Azure数据工厂发生故障之前和之后查找一组行,我将超过2,000,000行导入到临时表中。该过程在Azure中停止了1,500,000行。
错误是整数或字符串将被截断。
这行代码将PK添加到临时表并递增:
ALTER TABLE ##FLATFILETEMPBDI ADD ROWNUM INT IDENTITY
那将是获得行号的最简单解决方案。然后,我能够执行此查询以查找1,500,000前后的行:
SELECT
ROWNUM
, PARTDESCRIPTION
, LEN(PARTDESCRIPTION) AS LENDESCR
, QUANTITY
, ONORDER
, PRICE
, MANUFACTURERPARTNUMBER
从## FLATFILETEMPBDI 1499990和1500005之间的行数
完美地工作-没打算这么简单,有人惊讶地看到带有IDENTITY的ALTER TABLE为我进行了编号。