[AccessD] Stored Procedure return value

jwcolby jwcolby at colbyconsulting.com
Wed Jan 28 12:13:04 CST 2009


Thanks Martin.

Given that it is just me and my DB(s), and I am on the other 
side of the pond, I routinely change the nvarchar to varchar 
etc.


John W. Colby
www.ColbyConsulting.com


Martin Reid wrote:
> John
> 
> http://databases.aspfaq.com/general/why-do-some-sql-strings-have-an-n-prefix.html
> 
> Martin
> 
> 
> Martin WP Reid
> Information Services
> Queen's University
> Riddel Hall
> 185 Stranmillis Road
> Belfast
> BT9 5EE
> Tel : 02890974465
> Email : mwp.reid at qub.ac.uk
> ________________________________________
> From: accessd-bounces at databaseadvisors.com [accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby [jwcolby at colbyconsulting.com]
> Sent: 28 January 2009 17:08
> To: Access Developers discussion and problem solving
> Subject: Re: [AccessD] Stored Procedure return value
> 
> Asger,
> 
> Thanks for the response.  So that I can actually understand
> what I am doing, I have a couple of questions:
> 
>  > SET @sql = N'SELECT @PKID = min(PKID) FROM ' + @tblName;
> 
> What does the N' do?
> 
>  > EXEC sp_executesql @sql, N'@PKID int OUTPUT',
> @PKID=@MinPKID OUTPUT;
> 
> is this the equivalent of:
> 
> DECLARE @PKID int OUTPUT
> EXEC sp_executesql @sql, @PKID
> 
> Your code looks like perhaps it is dimensioning variables in
> the same line it is using them or something.  Needless to
> say I am not there yet so understanding (and thus modifying
> to my needs) the code is difficult.
> 
> John W. Colby
> www.ColbyConsulting.com
> 
> 
> Asger Blond wrote:
>> John,
>>
>> Have a look at sp_executesql, which allows you to send the value of an
>> output parameter to a variable.
>>
>> You could create a sp like this:
>>
>> CREATE PROCEDURE usp_MinMaxPKID @tblName varchar(100)
>> AS
>> DECLARE @MinPKID int, @MaxPKID int, @sql nvarchar(100);
>> SET @sql = N'SELECT @PKID = min(PKID) FROM ' + @tblName;
>> EXEC sp_executesql @sql, N'@PKID int OUTPUT', @PKID=@MinPKID OUTPUT;
>> SET @sql = N'SELECT @PKID = max(PKID) FROM ' + @tblName;
>> EXEC sp_executesql @sql, N'@PKID int OUTPUT', @PKID=@MaxPKID OUTPUT;
>> SELECT @MinPKID AS MinPKID, @MaxPKID AS MaxPKID;
>> GO
>>
>> Then execute the sp like this:
>>
>> EXEC usp_MinMaxPKID 'MyTable';
>> GO
>>
>> HTH
>> Asger
>>
>> -----Oprindelig meddelelse-----
>> Fra: accessd-bounces at databaseadvisors.com
>> [mailto:accessd-bounces at databaseadvisors.com] På vegne af jwcolby
>> Sendt: 27. januar 2009 19:39
>> Til: Access Developers discussion and problem solving
>> Emne: Re: [AccessD] Stored Procedure return value
>>
>> I am not going to get into a "dynamic SQL" debate.  Simply
>> understand that I run SQL Servers that have exactly and only
>> one person accessing them, ME.
>>
>> I have literally many dozens of databases, each with dozens
>> of queries and tables.  I am not going to edit the stored
>> procedures in each database I create in order to avoid an
>> injection attack that will never come.
>>
>> In my case it does initially complicate what I want to do
>> but it simplifies the big picture.  And once I learn the
>> technique, whatever it might be, then it will no longer
>> complicate my life.
>>
>> I have found an article about exactly what I am trying to
>> do, but of course it is just complicated enough that I have
>> to study it very carefully in order to figure out how the
>> heck they are doing it.
>>
>> Thanks for your example, I will work with it as well.
>>
>> John W. Colby
>> www.ColbyConsulting.com
>>
>>
>> Arthur Fuller wrote:
>>> Hi John,
>>>
>>> I must confess that I am not a fan of dynamic SQL, and that in your case
>> it
>>> complicates things.
>>>
>>> Normally (e.g. static SQL) one would write something like this:
>>>
>>> SET @minID = (SELECT Min(PKID) FROM myTable)
>>> and similarly for @maxID
>>>
>>> I haven't actually tried doing this in dynamic SQL but I think the same
>>> thing should work from there too. The trick is the SET part of the
>>> statement.
>>>
>>> hth,
>>> Arthur
>>>
>>> On Tue, Jan 27, 2009 at 8:50 AM, jwcolby
>> <jwcolby at colbyconsulting.com>wrote:
>>>> Arthur,
>>>>
>>>> What I still don't understand is how I get the data into the
>>>> variables to return INSIDE of the stored procedure.
>>>>
>>>>
>>>> For example, I might have a table with the PKID starts at
>>>> ~13 million and go to 87 million.  My external process can
>>>> only process 1 million records maximum so I need to grab 1
>>>> million record chunks of data.
>>>>
>>>> I need to get the min(PKID) and max(PKID) and I need to
>>>> return these to code out in Access so that I can then "get
>>>> the next million records" based on the PKID.  I want to do a
>>>> bulk export starting at 13 million to 14 million, then when
>>>> that works, 14 to 15 million etc.
>>>>
>>>> I have the SP written and tested that does that bulk export,
>>>> now all I need is the min(PKID) and Max(PKID) so I can start
>>>> carving up the table.
>>>>
>>>> I have written a usp_MinMaxPKID @tblName varchar, @MinPKID
>>>> int output, @MaxPKID int output
>>>>
>>>> So I have a SP with the values passed in and declared OUTPUT
>>>> (return value to calling procedure).  In the past I have
>>>> written dynamic code something like:
>>>>
>>>> declare @SQL = 'SELECT Min(PKID) as MinPKID, Max(PKID) as
>>>> MaxPKID from dbo.' + @tblName.
>>>>
>>>> exec(@sql)
>>>>
>>>> This had the effect of getting the min and max from the
>>>> table passed into @tblName, but it places the results into
>>>> the results pane in the query window when I execute the SP.
>>>>
>>>> Now I need to somehow place the results into the @MinPKID
>>>> and @MaxPKID.  It is this piece that I am "missing".
>>>>
>>>> Any help (from anyone) on how to do this would be much
>>>> appreciated.
>>>>
>>>> John W. Colby
>>>> www.ColbyConsulting.com <http://www.colbyconsulting.com/>
>>>>
>>>>
>>>>  Arthur Fuller wrote:
>>>>> >From the FE:
>>>>>
>>>>> declare a variable called intRowCount and set its value to zero.
>>>>>
>>>>> >From the BE's proc:
>>>>>
>>>>> Declare a parm called @intRowCount OUTPUT
>>>>>
>>>>> Execute the proc, passing your parm in.
>>>>>
>>>>> Interrogate the variable intRowCount upon return to your external code.
>>>>>
>>>>> That should do it.
>>>>>
>>>>> If this is unclear, I could whip up a toy program for you, but I think
>>>> that
>>>>> this ought to be clear enough for you to proceed. If not, say so and I
>>>> shall
>>>>> supply a toy program that demo's this approach.
>>>>>
>>>>> A.
>>>>>
>>>>> On Fri, Jan 23, 2009 at 5:35 PM, jwcolby <jwcolby at colbyconsulting.com
>>>>> wrote:
>>>>>
>>>>>> can the sp be tested from the query window in SQL Server.
>>>>>> IOW, I open a query, EXEC the sp_CountRec and pass in ... what?
>>>>>>
>>>>>> John W. Colby
>>>>>> www.ColbyConsulting.com <http://www.colbyconsulting.com/> <
>>>> http://www.colbyconsulting.com/>
>>>>  >>
>>>> --
>>>> AccessD mailing list
>>>> AccessD at databaseadvisors.com
>>>> http://databaseadvisors.com/mailman/listinfo/accessd
>>>> Website: http://www.databaseadvisors.com
>>>>
> --
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com



More information about the AccessD mailing list