在多列上插入行自动增量

时间:2012-03-23 15:36:19

标签: sql sql-server-2008 tsql auto-increment

我有下表

tbl_Users

Id , UserFile, Name  
1,1200,Jan  
2,1201,Piet  
3,1202,Joris  

第一列已经是一个标识列。现在我想将联系人的批量插入新用户。

INSERT INTO tbl_Users (UserFile,Name)  
    SELECT [AutoIncrement], Name 
    FROM tbl_ContactPerson 
    WHERE (ContactType = 'U') 

我的问题发生在[AutoIncrement],如何在UserFile列中添加+1,以便我在该列上自动增量?

我正在使用SQL Server 2008R2

亲切的问候

3 个答案:

答案 0 :(得分:7)

尝试在“批处理”选择中使用ROW_NUMBER()函数:

declare @StartValue int
SELECT @StartValue = MAX(UserFile) FROM tbl_Users 

INSERT INTO tbl_Users (UserFile,Name)   
    SELECT 
        (@StartValue + ROW_NUMBER() over (order by (select 1))) as IncrementNumber, 
        Name  
    FROM 
        tbl_ContactPerson  
    WHERE 
        (ContactType = 'U') 

(order by(select 1))是一个小的hack,用于按行返回的顺序对行进行编号。

您需要使用适当的基数为@StartValue播种。我已经使用了之前UserFile值的最大值。

编辑注意Andriy M关于原子性的评论如下。在上面的示例中,您至少需要一个可重复读取的事务来确保一致性。

答案 1 :(得分:0)

将UserFile列设置为auto_increment,并在选择查询中将其留空

INSERT INTO tbl_Users (UserFile,Name)  
    SELECT Name FROM tbl_ContactPerson WHERE (ContactType = 'U') 

或者这样做

INSERT INTO tbl_Users (UserFile,Name)  
    SELECT Max(UserFile) + 1, Name FROM tbl_ContactPerson WHERE (ContactType = 'U') 

答案 2 :(得分:0)

DECLARE @seed int
SELECT @seed = MAX(UserFile) FROM tbl_Users

CREATE TABLE #temp_users
(
  UserFile identity(@seed + 1, 1)
, Name varchar(max)
)

INSERT INTO #temp_users
  SELECT 
    Name 
  FROM 
    tbl_ContactPerson with (nolock)
  WHERE 
    (ContactType = 'U')

INSERT INTO tbl_Users
(
  UserFile
, Name
)
SELECT
  UserFile
, Name
FROM
  #temp_users

DROP TABLE #temp_users