This blog post is for those lucky souls programming in Classic ASP VBScript who need to access output variables in Microsoft SQL (T-SQL) stored procedures. In T-SQL, stored procedures can have out parameters (analogous to OUT parameters in .NET). This can be handy when only a scalar result is required, or maybe a small set of disjointed scalar results are needed and the programmer wants to avoid iterating between recordsets.
This example will use a simple three argument stored procedure where the first two arguments are for the strings to be concatenated and the third argument is the result.
First, creating the stored procedure and the proof of concept that the stored procedure works.
/* Note this removes the stored procedure if it exists but assumes any object named tmpSprocDemoConCat is a stored procedure. */ if object_id(N'dbo.tmpSprocDemoConCat') is not null drop procedure dbo.[tmpSprocDemoConCat] go create proc dbo.[tmpSprocDemoConCat] ( @string1 nvarchar(100) -- input variable in first position , @string2 nvarchar(100) -- input variable in first position , @outMessage nvarchar(200) output -- note the output keyword after the variable type ) as set @outMessage = coalesce(@string1,'') + coalesce(@string2,''); go declare @string1 nvarchar(5) , @string2 nvarchar(5) , @outMessage nvarchar(10) set @string1='Part1'; set @string2='Part2'; exec [tmpSprocDemoConCat] @string1, @string2, @outMessage out; -- note use of out keyword again print @outMessage;
If you run this in SQL Server Management Studio you will see the output message “Part1Part2” and the stored procedure will exist for our Classic ASP testing.
This is the VBScript Classic ASP code demonstrating use of the OUT parameter functionality.
<%@ Language=VBScript %> <% Server.ScriptTimeout = 720 Response.CacheControl = "no-cache" Response.ContentType = "text/plain" Response.AddHeader "Pragma", "no-cache" Response.Expires = -1 Const adVarChar = 200 Const adParamInput = &H0001 Const adParamOutput = &H0002 Const adCmdStoredProc = &H0004 Sub OpenDatabase (byref pConn) dim connStr connStr = "Provider=SQLOLEDB.1;Data Source=yourServerLocation;Initial Catalog=YourDatabaseName;User ID=yourUserId;Password=yourPassword" Set pConn = Server.CreateObject("ADODB.Connection") pConn.ConnectionTimeout = 120 pConn.CommandTimeout = 120 pConn.Open connStr End Sub Sub CloseDatabase (byref pConn) if pConn.State = 1 then '-- if open pConn.close end if Set pConn = Nothing End Sub OpenDatabase dbCon Private Function ConcatUsingSql(dbCon,string1,string2) Dim dbCommand, strMessageOut Set dbCommand = server.CreateObject("ADODB.Command") dbCommand.ActiveConnection = dbCon dbCommand.CommandText = "dbo.tmpSprocDemoConCat" With dbCommand .CommandType = adCmdStoredProc .Parameters.Append .CreateParameter("@string1", adVarChar, adParamInput, 100, string1) .Parameters.Append .CreateParameter("@string2", adVarChar, adParamInput, 100, string2) .Parameters.Append .CreateParameter("@outMessage", adVarChar, adParamOutput, 200, strMessageOut) .Execute strMessageOut = .Parameters(2).Value ' Zero based so "2" is the third parameter End With ConcatUsingSql = strMessageOut End Function response.write ConcatUsingSql(dbCon,"This is ","concatenation") CloseDatabase dbcon %>
Line 16 has the connection string you will need to update with the proper values.
The function ConcatUsingSql is pretty simple and you should see that calling a stored procedure seeking the result of an output argument is almost as easy as calling a stored procedure seeking on result at all. No effort is required to access recordset information. Instead, simply set the parameter direction to adParamOutput (a constant with a value of &H0002), execute the stored procedure and get that value.
Just remember, get the value of the output variable AFTER you execute the stored procedure.