Вставить автоинкремент строк на несколько столбцов - PullRequest
2 голосов
/ 23 марта 2012

У меня есть следующая таблица

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], как я могу добавить +1 к столбцу UserFile, чтобы у меня также был автоинкремент для этого столбца?

Я использую SQLServer 2008R2

С уважением

Ответы [ 3 ]

7 голосов
/ 23 марта 2012

Попробуйте использовать функцию 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)) - небольшой хак для нумерации строк в том порядке, в котором они были возвращены select.

Вам нужно заполнить @StartValue соответствующим базовым номером. Я использовал предыдущий максимум значения UserFile.

РЕДАКТИРОВАТЬ Обратите внимание на комментарий Андрея М ниже об атомарности. В приведенном выше примере вам потребуется как минимум транзакция с повторяющимся чтением для обеспечения согласованности.

0 голосов
/ 23 марта 2012
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
0 голосов
/ 23 марта 2012

Установите для столбца 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') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...