Introduction
The prefered way for applications to access SQL Server data is by the use
of
stored procedures. The benefits include increased performance, security,
and
code reuse. Often, beginning SQL Server developers find the use of
parameters,
especially output parameters, with stored procedures confusing. This
article
will demonstrate how to use parameters with stored procedures, including
some
sample code using VB.Net. The examples shown are based on SQL 2000, but
the
concepts apply to SQL 2005 as well.
Creating a stored procedure
From Books Online, here is the syntax used to create a stored
procedure:
CREATE PROC [ EDURE ] [ owner. ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]
You can also use the alter procedure statement to modify an
existing
stored procedure. A stored procedure can have up to 2,100 parameters. It
is
probably safe to assume that the typical stored procedure has no more
than ten.
Here is a very simple create procedure
statement that takes two input parameters and one output parameter.
Normally, a
stored procedure will perform some kind of data manipulation or retrieval,
so
this is not the average example. It will, however, serve as a simple way
to
illustrate the use of parameters.
CREATE PROC usp_AddTwoIntegers @FirstNumber int = 5,
@SecondNumber int, @Answer varchar(30) OUTPUT as
Declare @sum int
Set @sum = @FirstNumber + @SecondNumber
Set @Answer = 'The answer is ' + convert(varchar,@sum)
Return @sum
How to define a paramter
The first thing to remember is that the parameter name must start with an
@
symbol. The name can’t have spaces, and there are some characters that
are not
allowed. If you just stick with alpha-numeric characters and underscores
in
your parameter names you won’t have any problems naming parameters.
Second, the data type of the parameter and possibly the size must be
stated.
For example, the size of a parameter of type VARCHAR must be
specified.
Third, if you wish to access a return value from the parameter, the
OUTPUT
keyword must be used. In the example create proc statement, three
parameters are defined, two are integers. One of the parameters,
@Answer,
is an OUTPUT parameter and will be used to pass a value back to
the
caller.
Parameters can be given a default value. The @FirstNumber
parameter has
a default value of 5.
How to Call a Stored Procedure from Query
Analyzer
A stored procedure can be called from query analyzer, another stored
procedure
or any other client that can talk to SQL Server. Here is a sample script
that
can be pasted into Query Analyzer to demonstrate the use of our proc:
Declare @a int, @b int, @c varchar(30)
Select @a = 1, @b = 2
Exec usp_AddTwoIntegers @a, @b, @c OUTPUT
Select @c
---------------
The answer is 3
Notice that the keyword OUTPUT is used in the calling statement as well
as the
proc's definition. All of the arguments were defined as variables but
given
names that don’t match the original parameter names. This works because
SQL
resolves the parameters based on the position.
Only the output parameter must be defined up front. The next example
passes
literal values for the first two arguments.
Declare @Answer varchar(30)
Exec usp_AddTwoIntegers 1,2,@Answer OUTPUT
Select @Answer
---------------
The answer is 3
It is also possible to mix up the order of the arguments if the
parameters are
named in the calling statement.
The @FirstNumber parameter has a default that the proc will use
since the
argument is not specified.
Declare @Answer varchar(30)
Exec usp_AddTwoIntegers @Answer = @Answer OUTPUT, @SecondNumber = 5
Select @Answer
----------------
The answer is 10
Hopefully many of you have noticed that the actual numeric sum is also
returned
from the procedure. This example shows how to access the return
value.
Declare @sum int, @Answer varchar(30)
Exec @sum = usp_AddTwoIntegers 5,5,@Answer
Select @sum
-----------
10
Normally return values are used to report the success or failure of the
procedure. So, even though you can return any integer value from the proc,
usually a 0 for success or 1 for failure is returned.
Stored procedures are usually used to retrieve or manipulate data. Here
is a
typical stored procedure using the Northwind sample database that ships
with
SQL 2000. The parameter is used in the where clause to filter the
results.
Create proc usp_GetCustomerName @CustomerID varchar(5) as
Select CompanyName from Customers where CustomerID = @CustomerID
go
exec usp_GetCustomerName 'ANTON'
CompanyName
-----------------------
Antonio Moreno Taquería
Calling a stored procedure from VB.Net
As promised, here is a code snippet showing how to call a stored
procedure using
VB.Net. Again, no one would ever call a stored procedure to add two
numbers
together. This example is given to illustrate the use of parameters.
Create a new VB.Net Windows Application project. Add a button to the
form. Add
this statement to top of the form’s code window:
Imports System.Data.SqlClient
Paste this code into the form’s code window right above the End
Class statement. I added the sample stored procedure to the
Northwind database. Modify the connection string so it will work in your
environment.
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'You may need to modify the connection string
Dim conn As New SqlConnection("Integrated Security=SSPI;" _
& "Persist Security Info=False;Initial Catalog=Northwind;" _
& "Data Source=(local);Packet Size=4096;")
conn.Open()
'set up the command object
Dim myCommand As New SqlCommand("usp_AddTwoIntegers", conn)
myCommand.CommandType = CommandType.StoredProcedure
'add the first two parameters
myCommand.Parameters.Add("@FirstNumber", 5) 'this one is optional
myCommand.Parameters.Add("@SecondNumber", 5)
'The output and return parameters must be created as objects
Dim myAnswer As New SqlParameter("@Answer", SqlDbType.VarChar, 30)
myAnswer.Direction = ParameterDirection.Output
Dim mySum As New SqlParameter()
mySum.Direction = ParameterDirection.ReturnValue
'add them to the parameter collection
myCommand.Parameters.Add(myAnswer)
myCommand.Parameters.Add(mySum)
'execute the query
myCommand.ExecuteNonQuery()
'display the values
MsgBox(myAnswer.Value)
MsgBox(mySum.Value)
End Sub
Run the form and click the button to see the output parameter and
return values.
Conclusion
Using stored procedures is the best way for applications to access SQL
data.
This article explained, using a very simple example, how to use
parameters with
stored procedures.