T-SQL Cheat Sheet
T-SQL Cheat Sheet
T-SQL Cheat Sheet
Window Function
SELECT PurchaseOrderID,
ItemCode,
subtotal,
FROM pur.PurchaseOrderDetail
Casting
SELECT CAST('12345' AS NUMERIC(12, 2))
Case Expressions
SELECT Vendor_Code = CASE WHEN VendorItemCode IS NULL THEN ''
ELSE VendorItemCode
END
FROM pur.PurchaseOrderDetail
String Functions
SELECT LEN('sql server') -- 10
FROM product.Model
Date Functions
SELECT GETDATE() -- 2014-01-17 07:45:59.730
SELECT MONTH(GETDATE()) -- 1
SELECT DAY(getdate()) – 17
SELECT ISDATE('20130101') - 1
SELECT ISDATE('20139999') - 0
Metadata Queries
USE BikeStore
GO
NAME AS table_name
FROM sys.tables
FROM sys.columns
EXEC sys.sp_tables
EXEC sys.sp_help @objname = N'product.Model' -- returns general info about the object
SELECT @@VERSION -- Microsoft SQL Server 2008 R2 (SP1) - 10.50.2550.0 (X64) Jun 11 2012 16:41:53 Copyright (c) Microsoft
Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
CROSS JOIN
DECLARE @digits TABLE (digit INT)
SELECT d2.digit,
FROM @digits d1
Derived Tables
SELECT SalesYear,
SUM(LineTotal) AS TotalSold
LineTotal
GROUP BY SalesYear
AS (<subquery>)
<OUTER query>
LineTotal
SELECT SalesYear,
SUM(LineTotal) AS TotalSold
FROM SalesByYearCTE
GROUP BY SalesYear
Recursive CTE
Useful for querying tables that are self-referencing
DECLARE @Location_Table TABLE (
Location_ID INT,
Location_Name VARCHAR(25),
UNION ALL
SELECT 2, 'Iowa', 1
UNION ALL
UNION ALL
SELECT 4, 'Minnesota', 1
UNION ALL
SELECT 5, 'Nebraska', 1
UNION ALL
UNION ALL
UNION ALL
SELECT 8, 'Hospers', 2
UNION ALL
UNION ALL
UNION ALL
UNION ALL
UNION ALL
UNION ALL
WITH Location_CTE
AS (-- anchor
SELECT location_ID,
location_Name,
Location_Parent
FROM @Location_Table
UNION ALL
-- recurse
SELECT lt.Location_ID,
lt.Location_Name,
lt.Location_Parent
FROM Location_CTE lc
SELECT Location_ID,
Location_Name,
(SELECT Location_Name
FROM @Location_Table
FROM Location_CTE;
Correlated Queries
-- inside WHERE clause
BillOfMaterialsRevisionID,
Quantity
BillOfMaterialsRevisionID,
MaterialID,
Quantity,
EXISTS
SELECT mfg.NAME
FROM pur.PurchaseOrder po
Views
CREATE VIEW PUR.ViewManufacturersWithPurchases
AS
SELECT mfg.NAME
FROM pur.PurchaseOrder po
GO
SELECT *
FROM PUR.ViewManufacturersWithPurchases
Apply Operator
-- Query 5 most recent orders for each active product
SELECT a_left.PartNumberID,
p_right.DateSold,
p_right.LineTotal
CROSS APPLY -- replace with OUTER APPLY to include products from left that do not have any batches
DateSold,
LineTotal
WHERE a_left.StatusID = 1
SET Operators
< query 1 > -- column names define output columns
UNION ALL -- return rows from both queries - using all will return rows from both queries even if they are duplicates
EXCEPT -- return rows if they appear in the 1st query but not the 2nd query
PIVOT
Pivot = rows columns
Pivot Process
1. Group
2. Spread
3. Aggregate
SELECT...
FROM <source_table_or_table_expression>
WITH ProductSalesYearCTE AS (SELECT PartNumberID, [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]
LineTotal,
MONTH(DateSold) AS SalesMonth
FROM sales.SkuSales
IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])) AS P)
SELECT PartNumberID,
COALESCE([1], 0) AS January,
COALESCE([2], 0) AS February,
COALESCE([3], 0) AS March,
COALESCE([4], 0) AS April,
COALESCE([5], 0) AS May,
COALESCE([6], 0) AS June,
COALESCE([7], 0) AS July,
COALESCE([8], 0) AS August,
COALESCE([9], 0) AS September,
COALESCE([10], 0) AS October,
COALESCE([11], 0) AS November,
COALESCE([12], 0) AS December
FROM ProductSalesYearCTE
ORDER BY PartNumberID
UNPIVOT
unpivot – columns rows ```sql
SELECT...
FROM <source_table_or_table_expression>
AS <result_table_alias> ```
SELECT PartNumberID,
SalesMonth,
LineTotal
FROM sales.ViewProductSalesYear
IN (January, February, March, April, May, June, July, August, September, October, November, December)) AS U
FROM (VALUES (1, 2), (2, 3), (3, 4), (4, 5)) AS t(field_1, field2)
SELECT *
FROM (VALUES (10003, '20090213', 4, 'B'), (10004, '20090214', 1, 'A'), (10005, '20090213', 1, 'C'), (10006, '20090215', 3, 'C'))
Grouping Sets
SELECT PartNumberID,
Store,
SUM(LineTotal) AS TotalSold
FROM sales.SkuSales
);
-- ROLLUP clause
-- will return
-- 1) all Sales
-- 2) Each Store
-- 4) Does not return just the SKU because PartNumberID listed after Store in rollup clause
SELECT PartNumberID,
Store,
SUM(LineTotal) AS TotalSold
FROM sales.SkuSales
Group by cube
- total sales at each store, and for each sku
- PartNumberID Store
SELECT PartNumberID,
Store,
SUM(LineTotal) AS TotalSold
FROM sales.SkuSales
ORDER BY PartNumberID
SELECT ManufacturerCode,
NAME
FROM product.Model
EXEC product.ModelList
SELECT ModelID,
ManufacturerCode,
NAME
INTO tempdb.dbo.Model
FROM product.Model
Bulk Insert
test file:
1,Brian,2003
2,Kit,2006
3,Dean, 2007
4,Ryan,2010
USE tempdb;
id INT,
person VARCHAR(25),
year_started INT
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n');
Last Identity
SCOPE_IDENTITY() -- @@identity is legacy, do not use
SELECT IDENT_CURRENT('product.Model')
DELETE
SELECT TOP 100 *
INTO tempdb.dbo.Model
FROM product.Model
date_field DATE,
value_field VARCHAR(25)
SELECT *
FROM @table1
date_field DATE,
value_field VARCHAR(25)
UPDATE t1
FROM @table1 t1
UPDATE
dest.val2 = source.val2
OUTPUT clause
DECLARE @temp_table TABLE (ManufacturerCode VARCHAR(50))
SELECT ManufacturerCode
FROM product.ManufacturerCode
SELECT ManufacturerCode
FROM product.ManufacturerCode
-- delete
OUTPUT deleted.ManufacturerCode
-- use output clause to view changed values (there is no 'updated' value per se)
UPDATE @temp_table
inserted.ManufacturerCode AS new_value
Transactions
BEGIN TRAN -- if not specified, each statement runs as an implicit transaction
-- Statement #1
-- Statement #2
...
-- Statement N
ROLLBACK -- ALL statements since BEGIN TRAN are canceled, no data will be changed
SET XACT_ABORT,
NOCOUNT ON
BEGIN TRY
IF @starttrancount = 0
BEGIN TRANSACTION
IF @starttrancount = 0
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
@message VARCHAR(4000)
16,
1,
@error,
@message)
END CATCH
Locking
Exclusive Locks
generated by update operations
no other session can update or read an item that has an exclusive lock
Shared Locks
generated by selects
Isolation levels affect how sql interacts with shared locks:
READ UNCOMMITTED - SELECT does not generate shared locks - dirty reads
READ COMMITTED (default) - SELECT requires shared locks
REPEATABLE READ - shared lock open for the entire transaction
SERIALIZABLE - locks range of keys returned to prevent phantom records
SNAPSHOT - reads previous row reivsion stored in tempdb
READ COMMITTED SNAPSHOT - Gets the last committed version of the row that was available when the
statement started
Can be set at database level or transaction level:
SET TRANSACTION ISOLATION LEVEL <name>
Variables
DECLARE @i AS INT;
SET @i = 10;
@Name = NAME
FROM product.Model
Flow Control
-- single statements
ELSE
-- Multiple statements
BEGIN
END
ELSE
BEGIN
END
BEGIN
END
-- FOR replacement
DECLARE @i AS INT;
SET @i = 1
WHILE @i <= 10
BEGIN
PRINT @i;
SET @i = @i + 1;
END;
Cursors
DECLARE @ModelID INT,
@ManufacturerCode VARCHAR(25)
FOR
SELECT ModelID,
ManufacturerCode
FROM Product.Model
ORDER BY ModelID
OPEN C
FETCH NEXT
FROM C
INTO @ModelID,
@ManufacturerCode;
WHILE @@FETCH_STATUS = 0
BEGIN
-- do work
FETCH NEXT
FROM C
INTO @ModelID,
@ManufacturerCode;
END
CLOSE C;
DEALLOCATE C;
FROM product.model)
BEGIN
FROM product.model
-- do work
FROM product.model
END
Temporary Tables
CREATE TABLE #TempTable (
ModelID INT,
ManufacturerCode VARCHAR(25)
ModelID INT,
ManufacturerCode VARCHAR(25)
Table Variables
DECLARE @TempTable TABLE (
ModelID INT,
ManufacturerCode VARCHAR(25)
);
Table Types
IF TYPE_ID('dbo.OrderTotalsByYear') IS NOT NULL
DROP TYPE dbo.OrderTotalsByYear;
);
Dynamic SQL
-- EXEC
SET @sql = 'PRINT ''This message was printed by a dynamic SQL batch.'';';
EXEC (@sql);
SET @sql = N'select * from product.model where Name LIKE ''%'' + @Name + ''%'' AND CategoryId = @CategoryId'
@CategoryId = 2
@birthdate AS DATETIME,
@eventdate AS DATETIME
AS
BEGIN
CASE WHEN 100 * MONTH(@eventdate) + DAY(@eventdate) < 100 * MONTH(@birthdate) + DAY(@birthdate) THEN 1
ELSE 0
END
END
GO
Table Value
ALTER FUNCTION [dbo].[Split_MultiValue_Parameter] (
@delimitedString VARCHAR(MAX),
@delimiter VARCHAR(1)
AS
BEGIN
BEGIN
END
RETURN;
END
Stored Procedures
CREATE PROCEDURE product.ModelList
AS
BEGIN
SELECT ModelId,
NAME,
ManufacturerCode,
CategoryId,
Description
FROM product.Model
END
Triggers
DML - Data Modification
ALTER TRIGGER product.trProductPartNumberDateModified ON product.PartNumber
FOR UPDATE
AS
FROM Inserted;
UPDATE Product.PartNumber
Structural modification
CREATE TRIGGER [DDL_Notify] ON DATABASE
FOR DROP_TABLE,
ALTER_TABLE,
CREATE_TABLE,
DROP_FUNCTION,
ALTER_FUNCTION,
CREATE_FUNCTION,
DROP_PROCEDURE,
ALTER_PROCEDURE,
CREATE_PROCEDURE AS
-- actions
Try / Catch
BEGIN TRY
SELECT TOP 1 *
FROM product.model
END TRY
BEGIN CATCH
-- 4701 Cannot find the object "DoesNotExist" because it does not exist or you do not have permissions.
SELECT ERROR_NUMBER(),
ERROR_MESSAGE()
END CATCH
Temp1_pk INT IDENTITY(1, 1) NOT NULL CONSTRAINT PK_dbo_Temp1 PRIMARY KEY CLUSTERED,
VALUE VARCHAR(25)
GO
Temp2_pk INT IDENTITY(1, 1) NOT NULL CONSTRAINT pk_dbo_temp2 PRIMARY KEY CLUSTERED,
Temp1_fk INT NOT NULL CONSTRAINT FK_dbo_Temp2_dbo_Temp1 FOREIGN KEY (Temp1_fk) REFERENCES dbo.temp1(Temp1_pk),
VALUE VARCHAR(25) NULL
GO
Identity Insert
SET IDENTITY_INSERT product.Model ON