/
ch13.sql
381 lines (296 loc) · 11.5 KB
/
ch13.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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
-- 13-1. Creating a Table
CREATE TABLE dbo.Person (
PersonID INT IDENTITY CONSTRAINT PK_Person PRIMARY KEY CLUSTERED,
BusinessEntityId INT NOT NULL
CONSTRAINT FK_Person REFERENCES Person.BusinessEntity (BusinessEntityID),
First_Name VARCHAR(50) NOT NULL );
CREATE TABLE dbo.Test (
Column1 INT NOT NULL,
Column2 INT NOT NULL,
CONSTRAINT PK_Test PRIMARY KEY CLUSTERED (Column1, Column2));
-- 13-2. Adding a Column
ALTER TABLE dbo.Person
ADD Last_Name VARCHAR(50) NULL ;
-- 13-3. Adding a Column That Requires Data
ALTER TABLE dbo.Person
ADD IsActive BIT NOT NULL
CONSTRAINT DF__Person__IsActive DEFAULT (0 );
-- 13-4. Changing a Column
ALTER TABLE dbo.Person
ALTER COLUMN Last_Name VARCHAR(75) NULL ;
-- 13-5. Creating a Computed Column
ALTER TABLE Production.TransactionHistory
ADD CostPerUnit AS (ActualCost/Quantity);
CREATE TABLE HumanResources.CompanyStatistic (
CompanylD int NOT NULL,
StockTicker char(4) NOT NULL,
SharesOutstanding int NOT NULL,
Shareholders int NOT NULL,
AvgSharesPerShareholder AS (SharesOutstanding/Shareholders) PERSISTED);
SELECT TOP 1 CostPerUnit, Quantity, ActualCost
FROM Production.TransactionHistory
WHERE Quantity > 10
ORDER BY ActualCost DESC;
-- 13-6. Removing a Column
ALTER TABLE dbo.Person;
DROP COLUMN Last_Name ;
-- 13-7. Removing a Table
DROP TABLE dbo.Person;
-- 13-8. Reporting on a Table’s Definition
EXECUTE sp_help 'Person.Person';
-- 13-9. Reducing Storage Used by NULL Columns
CREATE TABLE dbo.WebsiteProduct (
WebsiteProductID int NOT NULL PRIMARY KEY IDENTITY(1,1),
ProductNM varchar(255) NOT NULL,
PublisherNM varchar(255) SPARSE NULL,
ArtistNM varchar(150) SPARSE NULL,
ISBNNBR varchar(30) SPARSE NULL,
DiscsNBR int SPARSE NULL,
MusicLabelNM varchar(255) SPARSE NULL );
INSERT dbo.WebsiteProduct (ProductNM, PublisherNM, ISBNNBR)
VALUES ('SQL Server 2012 Transact-SQL Recipes', 'Apress', '9781430242000');
INSERT dbo.WebsiteProduct (ProductNM, ArtistNM, DiscsNBR, MusicLabelNM)
VALUES ('Etiquette', 'Casiotone for the Painfully Alone', 1, 'Tomlab ');
SELECT ProductNM, PublisherNM,ISBNNBR FROM dbo.WebsiteProduct WHERE ISBNNBR IS NOT NULL;
ALTER TABLE dbo.WebsiteProduct
ADD ProductAttributeCS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS;
IF OBJECT_ID('dbo.WebsiteProduct', 'U') IS NOT NULL
DROP TABLE dbo.WebsiteProduct;
CREATE TABLE dbo.WebsiteProduct (
WebsiteProductID int NOT NULL PRIMARY KEY IDENTITY(1,1),
ProductNM varchar(255) NOT NULL,
PublisherNM varchar(255) SPARSE NULL,
ArtistNM varchar(150) SPARSE NULL,
ISBNNBR varchar(30) SPARSE NULL,
DiscsNBR int SPARSE NULL,
MusicLabelNM varchar(255) SPARSE NULL,
ProductAttributeCS xml COLUMN_SET FOR ALL_SPARSE_COLUMNS );
SELECT ProductNM, ProductAttributeCS
FROM dbo.WebsiteProduct
WHERE ISBNNBR IS NOT NULL;
INSERT dbo.WebsiteProduct (ProductNM, ProductAttributeCS)
VALUES ('Roots & Echoes',
'<ArtistNM>The Coral</ArtistNM>
<DiscsNBR>1</DiscsNBR>
<MusicLabelNM>Deltasonic</MusicLabelNM >');
SELECT * FROM dbo.WebsiteProduct ;
-- 13-10. Adding a Constraint to a Table
CREATE TABLE dbo.Person (
PersonID INT IDENTITY NOT NULL,
BusinessEntityId INT NOT NULL,
First_Name VARCHAR(50) NULL,
Last_Name VARCHAR(50) NULL);
ALTER TABLE dbo.Person
ADD CONSTRAINT PK_Person PRIMARY KEY CLUSTERED (PersonID),
CONSTRAINT FK_Person FOREIGN KEY (BusinessEntityId)
REFERENCES Person.BusinessEntity (BusinessEntityID),
CONSTRAINT UK_Person_Name UNIQUE (First_Name, Last_Name );
IF OBJECT_ID('dbo.Person','U') IS NOT NULL
DROP TABLE dbo.Person;
CREATE TABLE dbo.Person (
PersonID INT IDENTITY NOT NULL,
BusinessEntityId INT NOT NULL,
First_Name VARCHAR(50) NULL,
Last_Name VARCHAR(50) NULL,
CONSTRAINT PK_Person PRIMARY KEY CLUSTERED (PersonID),
CONSTRAINT FK_Person FOREIGN KEY (BusinessEntityId)
REFERENCES Person.BusinessEntity (BusinessEntityID),
CONSTRAINT UK_Person_Name UNIQUE (First_Name, Last_Name ) );
IF OBJECT_ID('dbo.Person','U') IS NOT NULL
DROP TABLE dbo.Person;
CREATE TABLE dbo.Person (
PersonID INT IDENTITY NOT NULL
CONSTRAINT PK_Person PRIMARY KEY CLUSTERED (PersonID),
BusinessEntityId INT NOT NULL
CONSTRAINT FK_Person FOREIGN KEY (BusinessEntityId)
REFERENCES Person.BusinessEntity (BusinessEntityID),
First_Name VARCHAR(50) NULL,
Last_Name VARCHAR(50) NULL,
CONSTRAINT UK_Person_Name UNIQUE (First_Name, Last_Name ) );
INSERT INTO dbo.Person (BusinessEntityId, First_Name) VALUES (1, 'MyName');
INSERT INTO dbo.Person (BusinessEntityId, First_Name) VALUES (1, 'MyName2');
INSERT INTO dbo.Person (BusinessEntityId) VALUES (1 );
-- 13-11. Creating a Recursive Foreign Key
CREATE TABLE dbo.Employees (
employee_id INT IDENTITY PRIMARY KEY CLUSTERED,
manager_id INT NULL REFERENCES dbo.Employees (employee_id ));
INSERT INTO dbo.Employees DEFAULT VALUES;
INSERT INTO dbo.Employees (manager_id) VALUES (1);
SELECT * FROM dbo.Employees;
INSERT INTO dbo.Employees (manager_id) VALUES (10);
-- 13-12. Allowing Data Modifications to Foreign Keys Columns in the Referenced Table to Be Reflected in the Referencing Table
IF OBJECT_ID('dbo.PersonPhone', 'U') IS NOT NULL
DROP TABLE dbo.PersonPhone;
IF OBJECT_ID('dbo.PhoneNumberType', 'U') IS NOT NULL
DROP TABLE dbo.PhoneNumberType;
IF OBJECT_ID('dbo.Person', 'U') IS NOT NULL
DROP TABLE dbo.Person;
CREATE TABLE dbo.Person
(
BusinessEntityId INT PRIMARY KEY,
FirstName VARCHAR(25),
LastName VARCHAR(25)
);
CREATE TABLE dbo.PhoneNumberType
(
PhoneNumberTypeId INT PRIMARY KEY,
Name VARCHAR(25)
);
INSERT INTO dbo.PhoneNumberType
SELECT PhoneNumberTypeId,
Name
FROM Person.PhoneNumberType;
INSERT INTO dbo.Person
SELECT BusinessEntityId,
FirstName,
LastName
FROM Person.Person
WHERE BusinessEntityID IN (1, 2);
CREATE TABLE dbo.PersonPhone (
[BusinessEntityID] [int] NOT NULL,
[PhoneNumber] [dbo].[Phone] NOT NULL,
[PhoneNumberTypeID] [int] NULL,
[ModifiedDate] [datetime] NOT NULL,
CONSTRAINT [UQ_PersonPhone_BusinessEntityID_PhoneNumber_PhoneNumberTypeID]
UNIQUE CLUSTERED
([BusinessEntityID], [PhoneNumber], [PhoneNumberTypeID]),
CONSTRAINT [FK_PersonPhone_Person_BusinessEntityID]
FOREIGN KEY ([BusinessEntityID])
REFERENCES [dbo].[Person] ([BusinessEntityID])
ON DELETE CASCADE,
CONSTRAINT [FK_PersonPhone_PhoneNumberType_PhoneNumberTypeID]
FOREIGN KEY ([PhoneNumberTypeID])
REFERENCES [dbo].[PhoneNumberType] ([PhoneNumberTypeID])
ON UPDATE SET NULL
);
INSERT INTO dbo.PersonPhone
(BusinessEntityId, PhoneNumber, PhoneNumberTypeId, ModifiedDate)
VALUES (1, '757-867-5309', 1, '2012-03-22T00:00:00'),
(2, '804-867-5309', 2, '2012-03-22T00:00:00');
SELECT 'Initial Data',
*
FROM dbo.PersonPhone;
DELETE FROM dbo.Person
WHERE BusinessEntityID = 1;
UPDATE dbo.PhoneNumberType
SET PhoneNumberTypeID = 4
WHERE PhoneNumberTypeID = 2;
SELECT 'Final Data',
*
FROM dbo.PersonPhone;
--
IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL
DROP TABLE dbo.Employees;
CREATE TABLE dbo.Employees (
EmployeeId INT PRIMARY KEY CLUSTERED,
First_Name VARCHAR(50) NOT NULL,
Last_Name VARCHAR(50) NOT NULL,
InsertedDate DATETIME DEFAULT GETDATE());
INSERT INTO dbo.Employees (EmployeeId, First_Name, Last_Name)
VALUES (1, 'Wayne', 'Sheffield');
INSERT INTO dbo.Employees (EmployeeId, First_Name, Last_Name, InsertedDate)
VALUES (2, 'Jim', 'Smith', NULL);
SELECT * FROM dbo.Employees;
-- 13-14. Validating Data as It Is Entered into a Column
CREATE TABLE dbo.BooksRead (
ISBN VARCHAR(20),
StartDate DATETIME NOT NULL,
EndDate DATETIME NULL,
CONSTRAINT CK_BooksRead_EndDate CHECK (EndDate > StartDate ));
INSERT INTO BooksRead (ISBN, StartDate, EndDate)
VALUES ('9781430242000', '2012-08-01T16:25:00', '2011-08-15T12:35:00 ');
IF OBJECT_ID('dbo.Employees','U') IS NOT NULL
DROP TABLE dbo.Employees;
CREATE TABLE dbo.Employees (
EmployeeId INT IDENTITY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
PhoneNumber VARCHAR(12) CONSTRAINT CK_Employees_PhoneNumber
CHECK (PhoneNumber LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9 ]'));
INSERT INTO dbo.Employees (FirstName, LastName, PhoneNumber)
VALUES ('Wayne', 'Sheffield', '800-555-1212');
INSERT INTO dbo.Employees (FirstName, LastName, PhoneNumber)
VALUES ('Wayne', 'Sheffield', '555-1212');
-- 13-15. Temporarily Turning Off a Constraint
ALTER TABLE dbo.Employees
NOCHECK CONSTRAINT CK_Employees_PhoneNumber ;
ALTER TABLE dbo.Employees
NOCHECK CONSTRAINT ALL;
ALTER TABLE dbo.Employees
CHECK CONSTRAINT CK_Employees_PhoneNumber;
ALTER TABLE dbo.Employees
WITH CHECK CHECK CONSTRAINT ALL ;
-- 13-16. Removing a Constraint
ALTER TABLE dbo.BooksRead
DROP CONSTRAINT CK_BooksRead_EndDate;
-- 13-17. Creating Auto-incrementing Columns
IF OBJECT_ID('dbo.Employees','U') IS NOT NULL
DROP TABLE dbo.Employees;
CREATE TABLE dbo.Employees (
employee_id INT IDENTITY PRIMARY KEY CLUSTERED,
manager_id INT NULL REFERENCES dbo.Employees (employee_id),
First_Name VARCHAR(50) NULL,
Last_Name VARCHAR(50) NULL,
CONSTRAINT UQ_Employees_Name UNIQUE (First_Name, Last_Name));
-- 13-18. Obtaining the Identity Value Used
SELECT @@IDENTITY, SCOPE_IDENTITY(), IDENT_CURRENT('dbo.Employees ');DBCC CHECKIDENT ('dbo.Employees');
-- 13-19. Viewing or Changing the Seed Settings on an Identity Column
TRUNCATE TABLE dbo.Employees;
INSERT INTO dbo.Employees (manager_id, First_Name, Last_Name)
VALUES (NULL, 'Wayne', 'Sheffield');
BEGIN TRANSACTION;
INSERT INTO dbo.Employees (manager_id, First_Name, Last_Name)
VALUES (1, 'Jim', 'Smith');
ROLLBACK TRANSACTION;
DBCC CHECKIDENT ('dbo.Employees', RESEED, 1);
INSERT INTO dbo.Employees (manager_id, First_Name, Last_Name)
VALUES (1, 'Jane', 'Smith');
SELECT * FROM dbo.Employees;
DBCC CHECKIDENT ('dbo.Employees');
-- 13-20. Inserting Values into an Identity Column
SET IDENTITY_INSERT dbo.Employees ON;
INSERT INTO dbo.Employees (employee_id, manager_id, First_Name, Last_Name)
VALUES (5, 1, 'Joe', 'Smith');
SET IDENTITY_INSERT dbo.Employees OFF;
-- 13-21. Automatically Inserting Unique Values
CREATE TABLE HumanResources.BuildingAccess(
BuildingEntryExitID uniqueidentifier ROWGUIDCOL
CONSTRAINT DF_BuildingAccess_BuildingEntryExitID DEFAULT NEWID()
CONSTRAINT UK_BuildingAccess_BuildingEntryExitID UNIQUE,
EmployeeID int NOT NULL,
AccessTime datetime NOT NULL,
DoorID int NOT NULL );
INSERT HumanResources.BuildingAccess (EmployeeID, AccessTime, DoorID)
VALUES (32, GETDATE(), 2);
SELECT *
FROM HumanResources.BuildingAccess;
SELECT $ROWGUID
FROM HumanResources.BuildingAccess ;
-- 13-22. Using Unique Identifiers Across Multiple Tables
CREATE SEQUENCE dbo.MySequence
AS INTEGER
START WITH 1
INCREMENT BY 1;
GO
CREATE TABLE dbo.Table1 (
Table1ID INTEGER NOT NULL,
Table1Data VARCHAR(50));
CREATE TABLE dbo.Table2 (
Table2ID INTEGER NOT NULL,
Table2Data VARCHAR(50));
INSERT INTO dbo.Table1 (Table1ID, Table1Data)
VALUES (NEXT VALUE FOR dbo.MySequence, 'Ferrari'),
(NEXT VALUE FOR dbo.MySequence, 'Lamborghini');
INSERT INTO dbo.Table2 (Table2ID, Table2Data)
VALUES (NEXT VALUE FOR dbo.MySequence, 'Apple'),
(NEXT VALUE FOR dbo.MySequence, 'Orange');
SELECT * FROM dbo.Table1;
SELECT * FROM dbo.Table2 ;
-- 13-23. Using Temporary Storage
CREATE TABLE #temp (
Column1 INT,
Column2 INT );
DECLARE @temp TABLE (
Column1 INT,
Column2 INT );