T-SQL OUTPUT
T-SQL possède une clause OUTPUT qui permet de récupérer les lignes modifiées ou supprimées lorsqu’on exécute une requête. Elle peut être utilisée par exemple, lorsqu'on veut suivre les modifications effectuées sur la base pour des besoins d'audit.
Dans cet article, j'utiliserai les données de la base AdventureWorks.

INSERT avec OUTPUT

On peut utiliser OUTPUT pour afficher les données modifiées comme on le ferait avec SELECT ou les insérer dans une table avec SELECT INTO. Par exemple, si vous voulez afficher les données insérées dans la table [SalesLT].[ProductCategory] :
INSERT INTO [SalesLT].[ProductCategory]
(
	[Name]
	,[rowguid]
	,[ModifiedDate]
)
OUTPUT
	inserted.Name,
	inserted.rowguid, 
	inserted.ModifiedDate

SELECT 
	CONCAT([Name], ' ', '2')
	,NEWID()
	,GETDATE()
FROM [SalesLT].[ProductCategory]
WHERE [ProductCategoryID] IN (10, 20, 30)
On obtient le résultat suivant:
OUTPUT INSERT
On utilise le préfixe inserted pour identifier les colonnes des lignes créées.
Vous pouvez également insérer ces données dans une table en utilisant la syntaxe suivante:
INSERT INTO [SalesLT].[ProductCategory]
(
	[Name]
	,[rowguid]
	,[ModifiedDate]
)
OUTPUT
	inserted.Name,
	inserted.rowguid, 
	inserted.ModifiedDate
INTO @Mytable([Name], [rowguid], [ModifiedDate])

SELECT 
	CONCAT([Name], ' ', '4')
	,NEWID()
	,GETDATE()
FROM [SalesLT].[ProductCategory]
WHERE [ProductCategoryID] IN (10, 20, 30)
Penser à créer la table variable Mytable.
DECLARE @Mytable TABLE
(
	[Name] VARCHAR(50)
	,[rowguid] UNIQUEIDENTIFIER
	,[ModifiedDate] DATETIME
)

DELETE avec OUTPUT

Vous pouvez également utiliser OUTPUT pour afficher les lignes supprimées.
On utilisera alors le préfixe deleted pour identifier les colonnes supprimées.

Par exemple, vous voulez afficher les ligne supprimées de la table [SalesLT].[ProductCategory].
DELETE FROM [SalesLT].[ProductCategory]
OUTPUT 
	deleted.Name
	,deleted.rowguid 
	,deleted.ModifiedDate
WHERE [ProductCategoryID] > 41
On obtient:
OUTPUT DELETE
Comme avec INSERT, vous pouvez insérer les lignes supprimées dans une table.
DELETE FROM [SalesLT].[ProductCategory]
OUTPUT 
	deleted.Name
	,deleted.rowguid 
	,deleted.ModifiedDate

INTO @Mytable([Name], [rowguid], [ModifiedDate])
WHERE [ProductCategoryID] > 41

UPDATE avec OUTPUT

Avec UPDATE, on a accès à l'état des lignes avant et après modifications. Pour l'état avant modification, on utilise le préfixe deleted et pour l'état après on utilise inserted.
Par exemple 
UPDATE [SalesLT].[ProductCategory]
SET [Name] = CONCAT([Name], ' ', 'new')
OUTPUT 
	deleted.Name as [old name]
	,inserted.name as [new name]
	,deleted.rowguid 
	,deleted.ModifiedDate
WHERE [ProductCategoryID] IN (5,10,15)
on obtient
Et bien sur, comme avec delete et insert on peut mettre ces infos dans une table en utilisant INTO.
Photo credit: trendingtopics on Visualhunt / CC BY
Auteur : Daniel MINKO FASSINOU

Laisser un commentaire




Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.