Consider you have a stored procedure that perform a SELECT operation for an object which is characterized by the ‘Start Date’ and ‘End Date’. Let’s assume we have the following TABLE:
Table Name: Events
- Columns:
- EventID int
- EventName Varchar(64)
- EventDesc Varchar(512)
- EventStartDate DateTime
- EventEndDate DateTime
And let’s assume that we have the following stored procedure:
CREATE PROCEDURE [dbo].[ListFilteredEvents]
-- Add the parameters for the stored procedure here
@StartDate datetime,
@EndDate datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT
Events.EventID,
Events.EventName,
Events.EventDesc,
Events.EventStartDate,
Events.EventEndDate
FROM
Events
WHERE
Events.EventStartDate>= @StartDate AND
Events.EventEndDate<= @EndDate
ORDER BY
Events.EventStartDate
END
Now what will happen if somehow the SP caller will pass blank value as the StartDate and/or EndDate? Error (Exception will be thrown) of course. If we have access to the source code of the application that execute this stored procedure, we could easily error-prevention at the application level. But if our access is only limited to database level, we could do the following:
CREATE PROCEDURE [dbo].[ListFilteredEvents]
-- Add the parameters for the stored procedure here
@StartDate datetime,
@EndDate datetime
AS
BEGIN
IF @StartDate IS NULL
BEGIN
-- Set it with the smallest value of DateTime data type
SET @StartDate=CAST('1753-01-01' as DATETIME)
END
IF @EndDate IS NULL
BEGIN
-- Set it with the biggest value of DateTime data type
SET @EndDate=CAST('9999-12-31' as DATETIME)
END
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT
Events.EventID,
Events.EventName,
Events.EventDesc,
Events.EventStartDate,
Events.EventEndDate
FROM
Events
WHERE
Events.EventStartDate>= @StartDate AND
Events.EventEndDate<= @EndDate
ORDER BY
Events.EventStartDate
END
END
This way we could prevent Error/Exception being thrown whenever a blank value is passed into the stored procedure.
Important Update: Saturday, 21 April 2007 13.43 PM -- Thanks for Bro MCA for pointing out a better solution =)
CREATE PROCEDURE [dbo].[ListFilteredEvents]
-- Add the parameters for the stored procedure here
-- Set it with the smallest value of DateTime data type
@StartDate DateTime='1753-01-01',
-- Set it with the biggest value of DateTime data type
@EndDate DateTime='9999-12-31'
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT
Events.EventID,
Events.EventName,
Events.EventDesc,
Events.EventStartDate,
Events.EventEndDate
FROM
Events
WHERE
Events.EventStartDate>= @StartDate AND
Events.EventEndDate<= @EndDate
ORDER BY
Events.EventStartDate
END