Solved

SQL - Best way to write this SP

Posted on 2016-08-01
9
39 Views
Last Modified: 2016-08-01
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
Comment
Question by:CAMPzxzxDeathzxzx
  • 5
  • 4
9 Comments
 
LVL 65

Expert Comment

by:Jim Horn
ID: 41737762
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
 

Author Comment

by:CAMPzxzxDeathzxzx
ID: 41737827
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
 
LVL 65

Expert Comment

by:Jim Horn
ID: 41737837
>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
Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

 

Author Comment

by:CAMPzxzxDeathzxzx
ID: 41737843
>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
 

Author Comment

by:CAMPzxzxDeathzxzx
ID: 41737857
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
 
LVL 65

Accepted Solution

by:
Jim Horn earned 500 total points
ID: 41737865
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
 

Author Comment

by:CAMPzxzxDeathzxzx
ID: 41737887
Couple of thoughts... = All Good!  Thnaks
0
 

Author Closing Comment

by:CAMPzxzxDeathzxzx
ID: 41737888
Thanks
0
 
LVL 65

Expert Comment

by:Jim Horn
ID: 41737890
Thanks for the grade.  Good luck with your SP.  -Jim
0

Featured Post

VMware Disaster Recovery and Data Protection

In this expert guide, you’ll learn about the components of a Modern Data Center. You will use cases for the value-added capabilities of Veeam®, including combining backup and replication for VMware disaster recovery and using replication for data center migration.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The Delta outage: 650 cancelled flights, more than 1200 delayed flights, thousands of frustrated customers, tens of millions of dollars in damages – plus untold reputational damage to one of the world’s most trusted airlines. All due to a catastroph…
This article shows gives you an overview on SQL Server 2016 row level security. You will also get to know the usages of row-level-security and how it works
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.
Via a live example combined with referencing Books Online, show some of the information that can be extracted from the Catalog Views in SQL Server.

813 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now