SQL SERVER REVISION
STORED PROCEDURES
CREATE TABLE employee (
id INT PRIMARY KEY,
name VARCHAR(100),
salary DECIMAL(10, 2),
managerid INT
);
INSERT INTO employee (id, name, salary, managerid)
VALUES
(1, 'John Doe', 50000.00, NULL),
(2, 'Jane Smith', 55000.00, 1),
(3, 'Michael Johnson', 60000.00, 1),
(4, 'Emily Davis', 48000.00, 2),
(5, 'Chris Brown', 52000.00, 2),
(6, 'Sarah Miller', 53000.00, 3),
(7, 'David Wilson', 47000.00, 3),
(8, 'Jessica Moore', 51000.00, 4),
(9, 'William Taylor', 56000.00, 5),
(10, 'Sophia Anderson', 58000.00, 6);
NORMAL PROCEDURE
Create Procedure spGetEmp
as
Begin
Select name,salary from employee
End
exec spGetEmp
PROCEDURES HAVING INPUT
Alter Procedure spGetEmploy
@name nvarchar(100)
as
Begin
Select name, managerid from employee Where name = @name
End
exec spGetEmploy 'Chris Brown'
Alter Procedure spGetEmploy
@name nvarchar(100),
@managerid int
as
Begin
Select name, managerid from employee Where name = @name and managerid = @managerid
End
exec spGetEmploy 'Chris Brown','2'
PROCEDURES USING OUTPUT
Create Procedure spGet
@salary int,
@EmployeeCount int Output
as
Begin
Select @EmployeeCount = COUNT(Id)
from employ
where salary=@salary
End
To execute
Declare @EmployeeTotal int
exec spGet 50000,@EmployeeTotal output
Print @EmployeeTotal
THEORY
Stored procedures are precompiled collections of SQL statements and optional control-of-flow statements that are stored
under a name and processed as a unit.
INDEX
CREATE < Clustered >/< NonClustered > Index ind
ON tblEmployee (SALARY ASC)
The index stores salary of each employee, in the ascending order
Execute: sp_helptext ind
TRIGGERS
CREATE TABLE Employee2 (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
JobTitle VARCHAR(50),
Department VARCHAR(50),
DateHired DATE,
Salary DECIMAL(10, 2)
);
CREATE TABLE EmployeeHistory2 (
EmployeeID INT,
FirstName VARCHAR(50),
LastName VARCHAR(50),
JobTitle VARCHAR(50),
Department VARCHAR(50),
DateHired DATE,
Salary DECIMAL(10, 2),
);
select * from Employee2
select * from EmployeeHistory2
CREATE TRIGGER EmployeeInsert
ON Employee2
FOR INSERT,DELETE
AS
BEGIN
INSERT INTO EmployeeHistory2
insert into EmployeeHistory2
select * from Inserted
insert into EmployeeHistory2
select * from Deleted
END;
alter table EmployeeHistory2 add ActionType varchar(30);
ALTER TRIGGER EmployeeInsert
ON Employee2
FOR INSERT
AS
BEGIN
INSERT INTO EmployeeHistory2
select *,'inserted' from Inserted
insert into EmployeeHistory2
select *,'deleted' from Deleted
END;
SELECT * FROM EmployeeHistory2
CREATE TRIGGER Employeeupd
ON Employee2
INSTEAD OF UPDATE
AS
BEGIN
INSERT INTO EmployeeHistory2
select * from Inserted
END;
UPDATE Employee2
SET Salary = 80000
WHERE EmployeeID = 1;
SELECT * FROM EmployeeHistory2;
THEORY
• DML Triggers (Data Manipulation Language):
AFTER Triggers: Execute after an insert, update, or delete operation.
INSTEAD OF Triggers: Execute in place of the usual insert, update, or delete operation.
• DDL Triggers (Data Definition Language):
These are triggered by DDL statements like CREATE, ALTER, and DROP. They can be used to enforce business rules,
audit changes, or prevent certain changes to the database schema.
Triggers are special types of stored procedures that automatically execute when a specific event occurs in the database.
VIEWS
Employee Table: Id,Name,Salary,Gender,DepartmentId
Department Table: DeptId,DeptName
NORMAL DISPLAY
Select Id, Name, Salary, Gender, DeptName
from tblEmployee
join tblDepartment
on Employee.DepartmentId = Department.DeptId
FROM VIEWS
Create View v1
as
Select Id, Name, Salary, Gender, DeptName
from tblEmployee
join tblDepartment
on Employee.DepartmentId = Department.DeptId
where <condition>
Update v1
set DeptName='IT' where Name = 'John'
THEORY
To look at view definition - sp_helptext v1
To show the view - select * from v1
To modify a view - ALTER VIEW statement
To Drop a view - DROP VIEW v1
Derived table and CTE(Common table expression)
Employee:Id,Name,Gender, DepartmentId
Department: DeptId, DeptName
USING VIEWS
Create view v1
as
Select DeptName, DepartmentId, COUNT(*) as TotalEmployees
from Employee
join Department
on Employee.DepartmentId = Department.DeptId
group by DeptName, DepartmentId
USING TEMP TABLE
Select DeptName, DepartmentId, COUNT(*) as TotalEmployees
into #TempEmployeeCount
from Employee
join Department
on Employee.DepartmentId = Department.DeptId
group by DeptName, DepartmentId
Select DeptName, TotalEmployees
From #TempEmployeeCount
where TotalEmployees >= 2
Drop Table #TempEmployeeCount
USING CTE
WITH cte_name (Column1, Column2, ..)
AS
( CTE_query )
Update cte_name set <expression> where<condition>
SQL query using CTE:
With EmployeeCount(DeptName, DepartmentId, TotalEmployees)
as
(
Select DeptName, DepartmentId, COUNT(*) as TotalEmployees
from Employee
join Department
on Employee.DepartmentId = Department.DeptId
group by DeptName, DepartmentId
)
Select DeptName, TotalEmployees
from EmployeeCount
where TotalEmployees >= 2
Window Function
SELECT Name, Gender, Salary,
ROW_NUMBER() OVER (ORDER BY <XYZ> PARTITION BY <XYZ>) AS RowNumber
FROM Employees
We can replace ROW_NUMBER() by RANK() , DENSE_RANK()