-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paththe-output-clause.sql
177 lines (150 loc) · 4.2 KB
/
the-output-clause.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
USE TestDB
GO
-- First, let's create an empty table with the structure we want.
CREATE TABLE #OrdersCustomerID
(
OrderID INT
, CustomerID NCHAR(10)
, OrderDate DATETIME
, ShipName NVARCHAR(80)
, ShipAddress NVARCHAR(120)
, ShipCity NVARCHAR(30)
, ShipCountry NVARCHAR(30)
, ShipPostalCode NVARCHAR(20)
)
-- Create a table for storing our inserted records.
CREATE TABLE TableForAuditingPurposes
(
OrderID INT
, CustomerID NCHAR(10)
, OrderDate DATETIME
, ShipName NVARCHAR(80)
, ShipAddress NVARCHAR(120)
, ShipCity NVARCHAR(30)
, ShipCountry NVARCHAR(30)
, ShipPostalCode NVARCHAR(20)
)
-- Using the OUTPUT clause to return information to the user.
INSERT INTO #OrdersCustomerID(OrderID, CustomerID, OrderDate, ShipName, ShipAddress, ShipCity, ShipCountry, ShipPostalCode)
OUTPUT
INSERTED.OrderID, INSERTED.OrderDate, INSERTED.ShipName, INSERTED.ShipAddress, INSERTED.ShipCity, INSERTED.ShipCountry, INSERTED.ShipPostalCode
SELECT
OrderID
, CustomerID
, OrderDate
, ShipName
, ShipAddress
, ShipCity
, ShipCountry
, ShipPostalCode
FROM
dbo.Orders
WHERE
CustomerID = 'GROSR'
-- Using the OUTPUT clause and insert into a table.
INSERT INTO #OrdersCustomerID(OrderID, CustomerID, OrderDate, ShipName, ShipAddress, ShipCity, ShipCountry, ShipPostalCode)
OUTPUT
INSERTED.OrderID, INSERTED.CustomerID, INSERTED.OrderDate, INSERTED.ShipName, INSERTED.ShipAddress, INSERTED.ShipCity, INSERTED.ShipCountry, INSERTED.ShipPostalCode
INTO
TableForAuditingPurposes(OrderID, CustomerID, OrderDate, ShipName, ShipAddress, ShipCity, ShipCountry, ShipPostalCode)
SELECT
OrderID
, CustomerID
, OrderDate
, ShipName
, ShipAddress
, ShipCity
, ShipCountry
, ShipPostalCode
FROM
dbo.Orders
WHERE
CustomerID = 'GROSR'
-- OUTPUT with DELETE statement, and inserting into a table
DELETE dbo.Orders
OUTPUT
DELETED.OrderID, DELETED.CustomerID, DELETED.OrderDate, DELETED.ShipName, DELETED.ShipAddress, DELETED.ShipCity, DELETED.ShipCountry, DELETED.ShipPostalCode
INTO
TableForAuditingPurposes(OrderID, CustomerID, OrderDate, ShipName, ShipAddress, ShipCity, ShipCountry, ShipPostalCode)
WHERE
CustomerID = 'SAVEA'
-- Rows for CustomerID: SAVEA were inserted into the auditing table
SELECT
OrderID, CustomerID, OrderDate, ShipName, ShipAddress, ShipCity, ShipCountry, ShipPostalCode
FROM
TableForAuditingPurposes
WHERE
CustomerID = 'SAVEA'
-- And removed from the Orders table
SELECT
OrderID, CustomerID, OrderDate, ShipName, ShipAddress, ShipCity, ShipCountry, ShipPostalCode
FROM
dbo.Orders
WHERE
CustomerID = 'SAVEA'
-- Using OUTPUT clause with UPDATE statement
UPDATE dbo.Orders
SET
ShippedDate = GETDATE()
OUTPUT
INSERTED.OrderID
, DELETED.ShippedDate AS Old_ShippedDate
, INSERTED.ShippedDate AS New_ShippedDate
WHERE
CustomerID = 'HUNGC'
-- Create a table for storing our updated records.
-- Let's say that we only are going to change the ShipDate of the Order we are going to audit.
CREATE TABLE AuditTableForUpdates
(
OrderID INT
, CustomerID NCHAR(10)
, OrderDate DATETIME
, ShippedDate_Old DATETIME
, ShippedDate_New DATETIME
, BatchDate DATETIME
)
--DECLARE @batch_date DATETIME = GETDATE()
UPDATE dbo.Orders
SET
ShippedDate = GETDATE()
OUTPUT
inserted.OrderID
, inserted.CustomerID
, inserted.OrderDate
, deleted.ShippedDate as ShippedDate_Old
, inserted.ShippedDate as ShippedDate_New
, @batch_date
INTO
AuditTableForUpdates(OrderID, CustomerID, OrderDate, ShippedDate_Old, ShippedDate_New, BatchDate)
WHERE
CustomerID = 'SIMOB'
-- Verify that we inserted the records we just updated.
SELECT
OrderID, CustomerID, OrderDate, ShippedDate_Old, ShippedDate_New, BatchDate
FROM
AuditTableForUpdates
WHERE
CustomerID = 'SIMOB'
-- Verify the records were updated in the original table.
SELECT
OrderID, CustomerID, ShippedDate
FROM
dbo.Orders
WHERE
CustomerID = 'SIMOB'
-- Returning the values of the OrderIDs for this Customer to their original values.
DECLARE @batch_date DATETIME = '2019-09-24 22:59:08.280'
UPDATE O
SET
O.ShippedDate = A.ShippedDate_Old
OUTPUT
inserted.OrderID
, deleted.ShippedDate AS ShippedDate_Old
, inserted.ShippedDate AS ShippedDate_New
FROM
dbo.Orders AS O
INNER JOIN dbo.AuditTableForUpdates as A
ON A.OrderID = O.OrderID
WHERE
A.BatchDate = @batch_date
AND A.CustomerID = 'SIMOB'