我有下表
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
亲切的问候
答案 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