Returns information from, or expressions based on, each row affected by an INSERT, UPDATE, DELETE, or MERGE statement. These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements. The results can also be inserted into a table or table variable. Additionally, you can capture the results of an OUTPUT clause in a nested INSERT, UPDATE, DELETE, or MERGE statement, and insert those results into a target table or view.
OUTPUT clause can generate table variable, a permanent table, or temporary table.
Using an OUTPUT Clause in an INSERT Statement
When you insert data into a table, you can use the OUTPUT clause to return a copy of the data that’s been inserted into the table. The OUTPUT clause takes two basic forms: OUTPUT and OUTPUT INTO. Use the OUTPUT form if you want to return the data to the calling application. Use the OUTPUT INTO form if you want to return the data to a table or a table variable.
Create Table MyTable (ID int, name varchar(100),createdAt datetime)
-- declare @InsertOutput2 table variable
DECLARE @InsertOutput2 table
(
ID int,
name nvarchar(50),
CreatedAt datetime
);
-- insert new row into table in your database
INSERT INTO MyTable
OUTPUT
INSERTED.ID,
INSERTED.Name,
INSERTED.CreatedAt
INTO @InsertOutput2
VALUES(111, 'Some text', GETDATE());
-- view inserted row in table
SELECT * FROM MyTable;
-- view output row in @InsertOutput2 variable
SELECT * FROM @InsertOutput2;
drop table MyTable
Create Table MyTable (ID int, name varchar(100),createdAt datetime)
-- declare @InsertOutput2 table variable
DECLARE @UpdateOutput1 table
(
ID int,
name nvarchar(50),
Oldname nvarchar(50),
CreatedAt datetime,
UpdatedAt datetime
);
-- insert new row into table in your database
INSERT INTO MyTable
VALUES(111, 'Some text', GETDATE());
UPDATE MyTable
SET
name = 'Changed...'
OUTPUT
INSERTED.ID,
INSERTED.Name,
DELETED.Name,
DELETED.CreatedAt,
getdate()
INTO @UpdateOutput1
WHERE Name = 'Some text';
-- view inserted row in table
SELECT * FROM MyTable;
-- view output row in @InsertOutput2 variable
SELECT * FROM @UpdateOutput1;
drop table MyTable
Using an OUTPUT Clause in an MERGE Statement
When working in SQL Server 2008, you can add an OUTPUT clause to a MERGE statement. The process is similar to adding the clause to an UPDATE statement; you use both the INSERTED and DELETED column prefixes.
CREATE TABLE dbo.Books2
(
BookID int NOT NULL PRIMARY KEY,
BookTitle nvarchar(50) NOT NULL,
ModifiedDate datetime NOT NULL
);
CREATE TABLE dbo.Books
(
BookID int NOT NULL PRIMARY KEY,
BookTitle nvarchar(50) NOT NULL,
ModifiedDate datetime NOT NULL
);
INSERT INTO Books2
VALUES(101, '100 Years of Solitude', GETDATE());
INSERT INTO Books2
VALUES(102, 'Pride & Prejudice', GETDATE());
--Once we’ve created the Books2 table, we can try a MERGE statement. In the following example, I declare the @MergeOutput1 variable, merge data from the Books table into the Books2 table, and view the results:
-- declare @MergeOutput1 table variable
DECLARE @MergeOutput1 table
(
ActionType nvarchar(10),
BookID int,
OldBookTitle nvarchar(50),
NewBookTitle nvarchar(50),
ModifiedDate datetime
);
INSERT INTO Books
VALUES(101, 'The Great Gatsby', GETDATE());
-- use MERGE statement to perform update on Book2
MERGE Books2 AS b2
USING Books AS b1
ON (b2.BookID = b1.BookID)
WHEN MATCHED
THEN UPDATE
SET b2.BookTitle = b1.BookTitle
OUTPUT
$action,
INSERTED.BookID,
DELETED.BookTitle,
INSERTED.BookTitle,
INSERTED.ModifiedDate
INTO @MergeOutput1;
-- view Books table
SELECT * FROM Books;
-- view updated rows in Books2 table
SELECT * FROM Books2;
-- view output rows in @MergeOutput1 variable
SELECT * FROM @MergeOutput1;
drop table Books
drop table Books2
$action Gives us the type of action that is performed by Merge statement per record.
No comments:
Post a Comment