|
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
[Back to original message]
|