Я немного неясен относительно контекста - это в триггере AFTER INSERT.
В любом случае, я не вижу способа сделать это за один вызов.Предложение OUTPUT позволит вам возвращать только те строки, которые вы вставили.Я бы порекомендовал следующее:
DECLARE @MyTable (
myID INT,
previousID INT,
myText1 VARCHAR(20),
myText2 VARCHAR(20)
)
INSERT @MyTable (previousID, myText1, myText2)
SELECT myID, myText1, myText2 FROM inserted
INSERT MyTable (myText1, myText2)
SELECT myText1, myText2 FROM inserted
-- @@IDENTITY now points to the last identity value inserted, so...
UPDATE m SET myID = i.newID
FROM @myTable m, (SELECT @@IDENTITY - ROW_NUMBER() OVER(ORDER BY myID DESC) + 1 AS newID, myID FROM inserted) i
WHERE m.previousID = i.myID
...
Конечно, вы бы не включили это в триггер AFTER INSERT, потому что он даст вам рекурсивный вызов, но вы можете сделать это в INSTEAD OFВставить триггер.Я могу ошибаться в рекурсивной проблеме;Я всегда избегал рекурсивного вызова, поэтому я никогда не узнавал.Однако использование @@ IDENTITY и ROW_NUMBER () - это трюк, который я использовал несколько раз в прошлом, чтобы сделать нечто подобное.