Как реализовать функцию массовой вставки в Sql Server 2005

У меня есть таблица в базе данных с именем пользователя, которая имеет следующие записи.

Userid FirstName LastName
1          fa      la
2          fb      lb
3          fc      lc

и еще одна табличная пользовательская форма

Userformid Userid  Form   Code modifieddate  Isclosed   IsForm 
1             1     ff     cc     somedate     0           0
2             1     gg     rr     somedate     0           0
3             1     bb     bb     somedate     0           0
4             2     ss     aa     somedate     0           0
5             2     qq     sa     somedate     0           0
6             3     ws     xc     somedate     0           0

Теперь мне нужно вставить новую запись для каждого идентификатора пользователя в таблицу пользовательской формы, и только столбцы формы и кода должны быть скопированы во вставленную строку из таблицы пользовательской формы только последней измененной датой (что-то вроде: - заказ по измененной дате desc.)

Output should be in userform table :
    Userformid Userid  Form   Code modifieddate  Isclosed   IsForm 
    1             1     ff     cc     somedate     0           0
    2             1     gg     rr     somedate     0           0
    3             1     bb     bb     somedate     0           0
    4             2     ss     aa     somedate     0           0
    5             2     qq     sa     somedate     0           0
    6             3     ws     xc     somedate     0           0
newly added row
    7             1     bb     bb     newdate     0           0
    8             2     qq     sa     newdate     0           0
    9             3     ws     xc     newdate     0           0

В пользовательской таблице и таблице пользовательской формы есть 6000 записей.

Как мы можем добиться этого, используя функцию массовой вставки ИЛИ используя любую другую технику в sql server 2005. Я не хочу использовать CURSOR.


person Sukhjeevan    schedule 21.12.2010    source источник


Ответы (1)


Что-то вроде этого, использование ROW_NUMBER должно помочь. Попробуйте сначала без INSERT, чтобы проверить результаты, которые он возвращает. Если это то, что вы хотите, просто раскомментируйте строку INSERT и вперед.

DECLARE @NewDate DATETIME
SET @NewDate = GETDATE()

--INSERT UserForm (UserId, Form, Code, modifieddate, IsClosed, IsForm)
SELECT UserId, Form, Code, @NewDate, IsClosed, IsForm
FROM
(
    SELECT ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY modifieddate DESC) AS RowNo, 
        UserId, Form, Code, IsClosed, IsForm
    FROM UserForm 
) x
WHERE RowNo = 1
person AdaTheDev    schedule 21.12.2010
comment
Привет АдаДев! Спасибо за советы. Это действительно сработало для меня. У меня есть запись, где RowNo = 2. Можете ли вы объяснить мне, что это значит? - person Sukhjeevan; 21.12.2010
comment
@Sukhi - рад, что смог помочь. То, что делает ROW_NUMBER с предложением PARTITION, генерирует увеличивающийся номер строки для каждой записи в наборе результатов, разделенной по идентификатору пользователя, это означает, что номер строки сбрасывается до 1 для каждого отдельного идентификатора пользователя, поэтому, если вы имеют 3 записи для данного идентификатора пользователя, им будут присвоены номера строк 1, 2 и 3 (в порядке убывания даты изменения). - person AdaTheDev; 21.12.2010