You are here: Re: Stored Procedure Range Not Working « MsSQL Server « IT news, forums, messages
Re: Stored Procedure Range Not Working

Posted by Erland Sommarskog on 12/22/06 11:33

red vertigo (rohankinsella@hotmail.com) writes:
> I am trying to write a basic stored procedure to return a range of
> values but admit that I am stumped. The procedure syntax used is:
>
> ALTER PROCEDURE Rpt_LegacyPurchaseOrderSp(
>
> @StartPoNumber PONumberType = 'Null',
> @FinishPoNumber PONumberType = 'Null')
>
> AS
>
> SET @StartPoNumber = 'PO_NUMBER_POMSTR'
> SET @FinishPoNumber = 'PO_NUMBER_POMSTR'
>
> SELECT IPPOMST_SID, --Start tbl_IPPOMST
>...
> FROM tbl_IPPOMST
> JOIN tbl_IPPOITM
> ON tbl_IPPOITM.PO_NUMBER_POITEM = tbl_IPPOMST.PO_NUMBER_POMSTR
> JOIN tbl_IPVENDM
> on tbl_IPVENDM.VENDOR_NUMBER_VENMSTR = tbl_IPPOMST.VENDOR_NUMBER_POMSTR
> WHERE tbl_IPPOMST.PO_NUMBER_POMSTR >= @StartPoNumber AND
> tbl_IPPOMST.PO_NUMBER_POMSTR <= @FinishPoNumber
>
> Basically, no rows are returned for the valid (records in database)
> range I enter. I have been troubleshopoting the syntax. This has
> involved commenting out references to @FinishPoNumber so in effect I
> just pass in a valid PO Number using @StartPoNumber parameter. This
> works in terms of returning all 76545 PO records.
>
> Can anyone help me to identify why this syntax will not return a range
> of PO records that fall between @StartPoNumber and @FinishPoNumber?

With the sample code posted, the procedure only returns data if there any
rows with the value PO_NUMBER_POMSTR. Are there any such rows?

If you comment out the initial SET statements, and call the procedure
like this:

EXEC Rpt_LegacyPurchaseOrderSp @StartPoNumber = 'Putte'

you will not get any rows back, because @FinnishPoNumber is the string
'Null' which is before Putte.

If you change the procedure like this, it may work better:

ALTER PROCEDURE Rpt_LegacyPurchaseOrderSp(

@StartPoNumber PONumberType = NULL,
@FinishPoNumber PONumberType = NULL) -- No quotes around NULL

-- Remove SET statements

SELECT ...
...
WHERE tbl_IPPOMST.PO_NUMBER_POMSTR >=
isnull(@StartPoNumber, SELECT MIN(PO_NUMBER_POMSTR)
FROM tbl_IPPOMST)
AND tbl_IPPOMST.PO_NUMBER_POMSTR <=
isnull(@FinishPoNumber, SELECT MAX(PO_NUMBER_POMSTR)
FROM tbl_IPPOMST)

Normally, you should use coalesce to replace NULL with another value, but
in this special case isnull() may be better of performance reasons.

--
Erland Sommarskog, SQL Server MVP, esquel@sommarskog.se

Books Online for SQL Server 2005 at
http://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books.mspx
Books Online for SQL Server 2000 at
http://www.microsoft.com/sql/prodinfo/previousversions/books.mspx

 

Navigation:

[Reply to this message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация