OUTPUT keyword
Αν έχετε γράψει κώδικα για triggers θα ξέρετε τους ψευδοπίνακες Inserted και Deleted μέσω των οποίων μπορεί κανείς να αποκτήσει πρόσβαση στις τιμές των rows που γίνονται INSERT, UPDATE ή DELETE, ακριβώς πριν να ολοκληρωθεί η διαδικασία.
Για παράδειγμα, ένα τυπικό πρόβλημα που θα έπρεπε να χρησιμοποιήσουμε triggers, είναι όταν αλλάζουμε την τιμή όλων των προϊόντων που ανήκουν σε μια κατηγορία και το ζητούμενο είναι να καταγράφουμε σε έναν πίνακα την προηγούμενη τιμή, τη νέα τιμή, την ημέρα και ώρα της αλλαγής και τον χρήστη που κάνει την αλλαγή. Εναλλακτικά, αν δεν θέλουμε να χρησιμοποιήσουμε triggers, θα πρέπει να γράψουμε μια μακροσκελή stored procedure η οποία θα κάνει ένα iteration σε όλες τις εγγραφές, θα κάνει ένα-ένα τα UPDATE που θα ακολουθούνται από ένα INSERT στο logging πίνακα (Χωρίς cursors ε! Με τον άλλον τρόπο, τον καλό, με while loop).
Στον SQL Server 2005 μπορούμε να χρησιμοποιήσουμε το keyword OUTPUT το οποίο μπαίνει στα INSERT, UPDATE και DELETE statements και μας δίνει πρόσβαση στους πίνακες Inserted και Deleted αλλά χωρίς να βρισκόμαστε στο context ενός trigger!
Δείτε εδώ:
DECLARE @PriceChangeDetails TABLE
(ProductID int, OldPrice money,
NewPrice money, UpdatedBy sysname, UpdateDate datetime)
UPDATE Products
SET UnitPrice = UnitPrice * 1.05
OUTPUT INSERTED.ProductID, DELETED.UnitPrice, INSERTED.UnitPrice,
suser_name(), getdate() INTO @PriceChangeDetails
WHERE CategoryID = 1
SELECT * FROM @PriceChangeDetails
Αντίστοιχα, όπως και στους triggers, στα INSERT statements έχουμε πρόσβαση μόνο στον πίνακα Inserted και στα DELETE statements μόνο στον πίνακα Deleted.
Οι περιπτώσεις που δεν μπορούμε να χρησιμοποιήσουμε το OUTPUT keyword είναι όταν έχουμε INSERT πάνω σε view και όταν το DML γίνεται σε local/distributed partitioned tables/views ή σε remote tables/views