SQL Server Tutorial SQL Server Advanced SQL Server Database SQL Server References

SQL Server - Stored Procedures



A procedure (also known as stored procedure) is a collection of SQL statements wrapped within the CREATE PROCEDURE / PROC statement. A procedure always contains a name, parameter lists, and SQL statements. It may also contain a conditional statement like IF or CASE or the Loops. A procedure can be invoked by using procedures, other procedures and applications.

Stored Procedure Features

  • Stored Procedure increases the performance of the applications. Once stored procedures are created, they are compiled and stored in the database.
  • Stored procedure reduces the traffic between application and database server. Because the application has to send only the stored procedure's name and parameters instead of sending multiple SQL statements.
  • The stored procedure are reusable. A business logic can be implemented within a stored procedure which can be used by applications multiple times, or can be used by different modules of an application. This makes the database more consistent. If any change is required, it can be made in the stored procedure only.
  • The stored procedures are more secure than the AdHoc queries. The permission can be granted to the user to execute the stored procedure without giving permission to the tables used in the stored procedure. The stored procedure helps to prevent the database from SQL Injection.

CREATE PROCEDURE

The CREATE PROCEDURE OR CREATE PROC statement is used to create a stored procedure. By default, a stored routine is associated with the default database. To associate the routine explicitly with a given database, specify the name as schema_name.procedure_name at the time of creation.

The stored procedure can also execute another stored procedure or a function that modularizes the code.

The syntax of using CREATE PROCEDURE statement in SQL Server (Transact-SQL) is given below:

CREATE { PROCEDURE | PROC } [schema_name.]procedure_name
  [ { @parameter [type_schema_name.] datatype }
    [ VARYING ] [ = default ] [ OUT | OUTPUT | READONLY ]
  ] [ ,...n ]

  [ WITH { ENCRYPTION | RECOMPILE | EXECUTE AS Clause } ]
  [ FOR REPLICATION ]

  AS

  BEGIN 
    --SQL Statements
  END;  

Parameters

schema_name Specify the name of the schema that owns the stored procedure.
procedure_name Specify the name to assign to this procedure.
@parameter Specify one or more parameters passed into the procedure.
type_schema_name Specify the data type of the parameter and the schema to which the data type belongs.
datatype Specify the data type for @parameter.
VARYING Specify for cursor parameters when the result set is an output parameter.
default Specify the default value to assign to @parameter.
OUT Indicates that @parameter is an output parameter.
OUTPUT Indicates that @parameter is an output parameter.
READONLY Indicates that @parameter can not be overwritten by the stored procedure.
ENCRYPTION Indicates that the source for the stored procedure will not be stored as plain text in the system views in SQL Server.
RECOMPILE Indicates that a query plan will not be cached for this stored procedure.
EXECUTE AS clause Sets the security context to execute the stored procedure.
FOR REPLICATION Indicates that the stored procedure is executed only during replication.

To invoke a stored procedure, the EXEC or EXECUTE statement is used. See the syntax below:

EXEC procedure_name;

OR

EXECUTE procedure_name;

Create Procedure without Parameter

Consider a database table called Employee with the following records:

EmpID     Name      City         Age    Salary 
--------  --------  -----------  -----  --------
1         John      London       25     3000   
2         Marry     New York     24     2750   
3         Jo        Paris        27     2800   
4         Kim       Amsterdam    30     3100   
5         Ramesh    New Delhi    28     3000   
6         Huang     Beijing      28     2800   

To fetch all records of this table where Salary is greater than or equal to 3000 and count all the table rows, the following code can be used which creates a procedure named high_salary_employees:

CREATE PROCEDURE high_salary_employees
AS
BEGIN
  SELECT * FROM Employee WHERE Salary >= 3000;  
END;  
GO;

After successful execution, the procedure can be called as follows:

EXEC high_salary_employees;  

This will produce the result as shown below:

EmpID     Name      City         Age    Salary 
--------  --------  -----------  -----  --------
1         John      London       25     3000    
4         Kim       Amsterdam    30     3100   
5         Ramesh    New Delhi    28     3000    

(3 row(s) affected)

Create Procedure with One Parameter

In this procedure, a parameter named 'var1' of integer type is used which takes the value from user. Its body part fetches the records from the table using a SELECT statement and returns only those rows that is provided by user.

CREATE PROCEDURE get_employees @var1 INT
AS
BEGIN
  SELECT TOP @var1 * FROM Employee; 
END; 
GO; 

After successful execution, the procedure can be called as follows:

EXEC get_employees @var1 = 3;  

This will produce the result as shown below:

EmpID     Name     City        Age    Salary 
--------  -------  ----------  -----  --------
1         John     London      25     3000   
2         Marry    New York    24     2750   
3         Jo       Paris       27     2800    

(3 row(s) affected)

Create Procedure with Two Parameter

In this procedure, two parameter named 'salary' and 'age', of integer types are used. The procedures uses the values of these variables to fetch the records from the table.

CREATE PROCEDURE employees_salary_age @age INT, @salary INT
AS
BEGIN
  SELECT * FROM Employee
  WHERE Salary >= @salary AND Age <= @age; 
END; 
GO; 

After successful execution, the procedure can be called as follows:

EXEC employees_salary_age @salary =2800, @age = 28;  

This will produce the result as shown below:

EmpID     Name      City         Age    Salary 
--------  --------  -----------  -----  --------
1         John      London       25     3000     
3         Jo        Paris        27     2800    
5         Ramesh    New Delhi    28     3000   
6         Huang     Beijing      28     2800     

(4 row(s) affected)

Drop Procedure

Once a procedure is created in SQL Server (Transact-SQL), it can be removed by using DROP PROCEDURE statement.

Syntax

The syntax of removing a procedure in SQL Server (Transact-SQL) is given below:

DROP { PROC | PROCEDURE } [IF EXISTS] [schema_name.]procedure_name; 

The IF EXISTS is an optional parameter that conditionally removes procedure only if it exists on the database. If a procedure is deleted which does not exist, it will raise an error.

The schema_name is optional. If it is omitted, the procedure is dropped from the default database. The above statement removes a procedure named procedure_name.

Example:

To drop a procedure named CalcMaxSalary, the following statement can be used:

DROP PROCEDURE CalcMaxSalary;