ВСТАВЬТЕ В ВЫБОР ИЗ ОБНОВЛЕНИЯ - PullRequest
0 голосов
/ 21 июня 2011

Мне нужно выбрать некоторые значения из таблицы для обновления, а затем обновить их сразу. Кроме того, мне нужно вставить одну новую запись в таблицу для каждой обновленной записи. Для выбора записей и обновления я использую структуру типа

UPDATE TableA SET SomeField = 1 OUTPUT RecordID FROM TableA WHERE RecordID IN
(    
    SELECT TOP @Something RecordID FROM TableA    
)

Теперь, для части вставки, я хотел бы заключить оператор UPDATE в INSERT INTO SELECT, используя, таким образом, предложение OUTPUT. Тем не менее, SQL жалуется, когда я

INSERT INTO TableA SELECT ( RecordID , GETDATE() ) FROM
(
    UPDATE TableA SET SomeField = 1 OUTPUT RecordID FROM TableA WHERE RecordID IN
    (        
        SELECT TOP @Something RecordID FROM TableA        
    )
)

Разве я не могу сделать все это в одном выражении, даже с предложением OUTPUT?

Ответы [ 3 ]

2 голосов
/ 21 июня 2011
UPDATE TableA SET SomeField = 1 
OUTPUT inserted.RecordID, GETDATE() into TableA (RecordID , DT)
FROM TableA 
WHERE RecordID IN
(        
    SELECT TOP @Something RecordID FROM TableA        
)

Только не уверен - вы пытаетесь снова вставить обновленные строки?

0 голосов
/ 21 июня 2011

Конечно, вы могли бы попробовать что-то вроде этого:

INSERT INTO TableA (RecordID, Value)
SELECT RecordID, GETDATE()
FROM OPENQUERY(
  <i>yourserver</i>,
  'UPDATE TableA
  SET SomeField = 1
  OUTPUT inserted.RecordID
  WHERE RecordID IN (SELECT TOP (5) RecordID FROM TableA)'
)

Но есть пара проблем с подходом:

  1. Вам необходимо создать связанный сервер yourserver.

  2. «Удаленный» запрос не будет очень быстрым.

  3. Вам будет трудно заменить TOP (5) на TOP (@Something). На самом деле вам, скорее всего, придется превратить весь оператор в динамический запрос. (Правильно, вам нужно поместить уже динамическое ОБНОВЛЕНИЕ в другой динамический запрос.)

Полагаю, в последнем выпуске ограничение в одно утверждение будет окончательно снято.

Итак, почему бы не сделать так:

DECLARE @tmpRecords TABLE (RecordID int);

UPDATE TableA
SET SomeField = 1
OUTPUT inserted.RecordID INTO @tmpRecords (RecordID)
WHERE RecordID IN (SELECT TOP (@Something) RecordID FROM TableA);

INSERT INTO TableA (RecordID, SomeDateColumn)
SELECT RecordID, GETDATE()
FROM @tmpRecords;
0 голосов
/ 21 июня 2011

Можно использовать выходные данные для вставки обновленных строк из одной таблицы в другую: однако я не могу использовать тот синтаксис, который вы используете для работы.Пожалуйста, проверьте эту ссылку

...