Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 69
  • Last Modified:

SQL - Best way to write this SP

I'm looking for the best way to write this as a stored procedure.  

DECLARE @ContainerName VarChar(100)
DECLARE @ContainerID Int
DECLARE @CompanyID Int
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime

SET @ContainerName = ''
SET @ContainerID = ''
SET @CompanyID = ''
SET @StartDate = ''
SET @EndDate = ''


  
DELETE FROM [dbo].[AuditGas] WHERE [Audit] Like '%' + @ContainerName + '%' AND [CompanyID] = @CompanyID AND [DateStamp] BETWEEN @StartDate and @EndDate
  
Delete FROM [dbo].[ContainerEvents] WHERE [ContainerID] = @ContainerID AND [DateStamp] BETWEEN @StartDate and @EndDate

DELETE FROM [dbo].[ContainerNameplateCapacityChanges] WHERE [ContainerID] = @ContainerID AND [ChangeDate] BETWEEN @StartDate and @EndDate

DELETE FROM [dbo].[ContainerSpecs] WHERE [ContainerID] = @ContainerID AND [DateStamp] BETWEEN @StartDate and @EndDate

DELETE FROM [dbo].[CurrentGasWeight] WHERE [ContainerID] = @ContainerID AND [ChangeDate] BETWEEN @StartDate and @EndDate

DELETE FROM [dbo].[Emission] WHERE [ContainerID] = @ContainerID AND [DateStamp] BETWEEN @StartDate and @EndDate

DELETE FROM [dbo].[WarningEvents] WHERE [ContainerID] = @ContainerID AND [DateStamp] BETWEEN @StartDate and @EndDate

DELETE FROM [dbo].[WeighingEvents] WHERE [ContainerID] = @ContainerID AND [DateStamp] BETWEEN @StartDate and @EndDate

Open in new window

0
CAMPzxzxDeathzxzx
Asked:
CAMPzxzxDeathzxzx
  • 5
  • 4
1 Solution
 
Jim HornMicrosoft SQL Server Developer, Architect, and AuthorCommented:
Define 'best' by explaining to us what your requirements are, as 'best' is pretty subjective and we'd rather not guess.

If you mean parameterize the variables...
CREATE PROC your_proc (
	@ContainerName VarChar(100)  = '', 
	@ContainerID Int, 
	@CompanyID Int, 
	@StartDate DateTime, 
	@EndDate DateTime) 
AS 

-- Meaningful code comments go here. 

DELETE FROM dbo.AuditGas WHERE Audit Like '%' + @ContainerName + '%' AND CompanyID = @CompanyID AND DateStamp BETWEEN @StartDate and @EndDate
Delete FROM dbo.ContainerEvents WHERE ContainerID = @ContainerID AND DateStamp BETWEEN @StartDate and @EndDate
DELETE FROM dbo.ContainerNameplateCapacityChanges WHERE ContainerID = @ContainerID AND ChangeDate BETWEEN @StartDate and @EndDate
DELETE FROM dbo.ContainerSpecs WHERE ContainerID = @ContainerID AND DateStamp BETWEEN @StartDate and @EndDate
DELETE FROM dbo.CurrentGasWeight WHERE ContainerID = @ContainerID AND ChangeDate BETWEEN @StartDate and @EndDate
DELETE FROM dbo.Emission WHERE ContainerID = @ContainerID AND DateStamp BETWEEN @StartDate and @EndDate
DELETE FROM dbo.WarningEvents WHERE ContainerID = @ContainerID AND DateStamp BETWEEN @StartDate and @EndDate
DELETE FROM dbo.WeighingEvents WHERE ContainerID = @ContainerID AND DateStamp BETWEEN @StartDate and @EndDate

GO

Open in new window


Couple of observations..
  • You can't set a numeric or date data type to an empty string ''.  You can set it to NULL.  Explain in further detail what you're trying to do there.
  • The use of BETWEEN is not abundantly best practice, as that implies that anything that is one or the other would be returned in the WHERE, which may not be intended.
  • I eliminated the unnecessary square brackets.
0
 
CAMPzxzxDeathzxzxAuthor Commented:
I'll be passing the parameters and there will be no empty strings.

I'm looking for opinions to answer things like using between.

I thought somebody would recommend adding start / end to each delete.

Best = save me from making mistakes that experience has taught you:)

Bottom Line:  If you are a hard core SQL developer and you need to accomplish this within a single SP - How would you do it?
0
 
Jim HornMicrosoft SQL Server Developer, Architect, and AuthorCommented:
>I'll be passing the parameters and there will be no empty strings.
Ok, but your code SET all variables to empty strings '', and that's why I commented on that.

>I'm looking for opinions to answer things like using between.
Read SQL Expert Paul Maxwell's article Beware of Between.  In general it's a best practice to use this instead (change the names to meet your situation)

WHERE dtStart >= @some_start_date AND dtEnd < @some_end_date

Open in new window


>Best = save me from making mistakes that experience has taught you:)
Understand, but please also understand that this is not the most actionable question, as essentially it's a 'look at my code and tell me stuff', which means it's hard to tell when the question is completely answers.  Much better to ask specific questions.   Check out Top 10 Ways to Ask Better Questions, Number 10 for some added commentary.

>If you are a hard core SQL developer and you need to accomplish this within a single SP - How would you do it?
That was answered in my first comment, but without details on what exactly you need it's hard to state whether the code I provided will meet all requirements.
0
What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

 
CAMPzxzxDeathzxzxAuthor Commented:
>If you are a hard core SQL developer and you need to accomplish this within a single SP - How would you do it?
 That was answered in my first comment, but without details on what exactly you need it's hard to state whether the code I provided will meet all requirements.

>>>> Your first answer did not recommend -
WHERE dtStart >= @some_start_date AND dtEnd < @some_end_date

Open in new window


I do appreciate your help.
0
 
CAMPzxzxDeathzxzxAuthor Commented:
What do you think?
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE ID = OBJECT_ID(N'[dbo].[usp_ContainerRollbackBetweenDates]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[usp_ContainerRollbackBetweenDates];
GO

CREATE PROCEDURE [dbo].[usp_ContainerRollbackBetweenDates]
(
	@ContainerName VarChar(100), 
	@ContainerID Int, 
	@CompanyID Int, 
	@StartDate DateTime, 
	@EndDate DateTime

)
AS
BEGIN

	DELETE FROM [dbo].[AuditGas] WHERE [Audit] Like '%' + @ContainerName + '%' AND [CompanyID] = @CompanyID AND [DateStamp] >= @StartDate AND [DateStamp] < @EndDate
  
	Delete FROM [dbo].[ContainerEvents] WHERE [ContainerID] = @ContainerID AND [DateStamp] >= @StartDate AND [DateStamp] < @EndDate

	DELETE FROM [dbo].[ContainerNameplateCapacityChanges] WHERE [ContainerID] = @ContainerID AND [ChangeDate] >= @StartDate AND [ChangeDate] < @EndDate

	DELETE FROM [dbo].[ContainerSpecs] WHERE [ContainerID] = @ContainerID AND [DateStamp] >= @StartDate AND [DateStamp] < @EndDate

	DELETE FROM [dbo].[CurrentGasWeight] WHERE [ContainerID] = @ContainerID AND [ChangeDate] >= @StartDate AND [ChangeDate] < @EndDate

	DELETE FROM [dbo].[Emission] WHERE [ContainerID] = @ContainerID AND [DateStamp] >= @StartDate AND [DateStamp] < @EndDate

	DELETE FROM [dbo].[WarningEvents] WHERE [ContainerID] = @ContainerID AND [DateStamp] >= @StartDate AND [DateStamp] < @EndDate

	DELETE FROM [dbo].[WeighingEvents] WHERE [ContainerID] = @ContainerID AND [DateStamp] >= @StartDate AND [DateStamp] < @EndDate

END
GO

Open in new window

0
 
Jim HornMicrosoft SQL Server Developer, Architect, and AuthorCommented:
Looks good.  Couple of thoughts.
  • Will StartDate-EndDate ever have a NULL value?  If yes, you'll want to consider how to handle that, but SETting them to a dummy value or maybe some IF.. custom logic.
  • Same with ContainerID and CustomerID.  Will there ever be a NULL passed, or maybe a value that is intended to be an '<ALL>'?
  • Are any of these tables related to other tables?  If yes you may have to change the order, or maybe add other tables.
0
 
CAMPzxzxDeathzxzxAuthor Commented:
Couple of thoughts... = All Good!  Thnaks
0
 
CAMPzxzxDeathzxzxAuthor Commented:
Thanks
0
 
Jim HornMicrosoft SQL Server Developer, Architect, and AuthorCommented:
Thanks for the grade.  Good luck with your SP.  -Jim
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

  • 5
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now