Ich frage mich nur, ob ich Feedback zu einer von mir ausgeführten gespeicherten Prozedur einholen kann und ob das Szenario effizienter gehandhabt werden kann (ich bin mir ziemlich sicher, dass dies der Fall sein wird!).
Grundsätzlich habe ich einen einzelnen SP, den ich aufrufe, um eine Liste von Datensätzen (Jobs) mit einem oder mehreren Status und einer Sortierreihenfolge zurückzugeben (ich verwende RowNum zum Blättern). Im Moment benutze ich WITH RECOMPILE, da sich die Variationen der Status ständig ändern können (abhängig vom Benutzer usw.). Es wird auch gefiltert.
Ich verwende eine IF-Anweisung, um im Wesentlichen das gleiche Codebit auszuführen, wobei die einzige Änderung die Sortierreihenfolge ist.
Ich denke, meine Fragen sind: Gibt es eine bessere Möglichkeit, dies zu tun (möglicherweise unterschiedliche SPs für unterschiedliche Status)? Bin ich aufgrund mangelnder Kenntnisse überkompliziert? (Sehr wahrscheinlich) Ist der SP tatsächlich in Ordnung, erfordert jedoch geringfügige Änderungen, um die Anzahl der Zeilen zu verringern?
Ich habe unten einen Teil der SP eingefügt - der einzige Unterschied zum vollständigen Code sind die zusätzlichen IF-Anweisungen für die verschiedenen Sortierreihenfolgen ...
Ich würde mich über Feedback freuen.
Danke im Voraus!
PROCEDURE [dbo].[sp_Jobs]
@PageNumber int,
@PageSize int,
@FilterExpression varchar(500),
@OrderBy varchar(50),
@CustomerID int,
@ShowNotSet bit,
@ShowPlaced bit,
@ShowProofed bit,
@ShowReProofed bit,
@ShowApproved bit,
@ShowOnTime bit,
@ShowLate bit,
@ShowProblem bit,
@ShowCompleted bit,
@ShowDispatched bit,
@ShowUnapproved bit,
@ShowClosed bit,
@ShowReturned bit,
@UserID int
WITH RECOMPILE
AS
--JobNumber DESC
if @OrderBy='JobNumberDESC'
BEGIN
WITH Keys AS (SELECT TOP (@PageNumber * @PageSize) ROW_NUMBER() OVER (ORDER BY JobNumber DESC) as rn,P1.jobNumber,P1.CustID,P1.DateIn,P1.DateDue,P1.DateOut,p1.client,p1.MasterJobStatusID,p1.MasterJobStatusTimestamp,p1.OwnerID
FROM
vw_Jobs_List P1 WITH (NOLOCK)
WHERE
(@CustomerID = 0 OR CustID = @CustomerID)
AND (@UserID = 0 OR OwnerID = @UserID)
AND ((@ShowNotSet = 1 AND MasterJobStatusID=1) OR (@ShowPlaced = 1 AND MasterJobStatusID=2) OR (@ShowProofed = 1 AND MasterJobStatusID=3) OR (@ShowReProofed = 1 AND MasterJobStatusID=4) OR (@ShowApproved = 1 AND MasterJobStatusID=5) OR (@ShowOnTime = 1 AND MasterJobStatusID=6) OR (@ShowLate = 1 AND MasterJobStatusID=7) OR (@ShowProblem = 1 AND MasterJobStatusID=8) OR (@ShowCompleted = 1 AND MasterJobStatusID=9) OR (@ShowDispatched = 1 AND MasterJobStatusID=10) OR (@ShowUnapproved = 1 AND MasterJobStatusID=11) OR (@ShowClosed = 1 AND MasterJobStatusID=12) OR (@ShowReturned = 1 AND MasterJobStatusID=13)) AND (Search LIKE '%'+@FilterExpression+'%')
ORDER BY
P1.JobNumber DESC ),SelectedKeys AS (
SELECT TOP (@PageSize)SK.rn,SK.JobNumber,SK.CustID,SK.DateIn,SK.DateDue,SK.DateOut
FROM
Keys SK
WHERE
SK.rn > ((@PageNumber-1) * @PageSize)
ORDER BY
SK.JobNumber DESC)
SELECT SK.rn,J.JobNumber,J.OwnerID,J.Description,J.Client,SK.CustID,OrderNumber, CAST(DateAdd(d, -2, CAST(isnull(SK.DateIn,0) AS DateTime)) AS nvarchar) AS DateIn, CAST(DateAdd(d, -2, CAST(isnull(SK.DateDue,0) AS DateTime)) AS nvarchar) AS DateDue,CAST(DateAdd(d, -2, CAST(isnull(SK.DateOut,0) AS DateTime)) AS nvarchar) AS DateOut, Del_Method,Ticket#, InvoiceEmailed, InvoicePrinted, InvoiceExported, InvoiceComplete, JobStatus,j.MasterJobStatusID,j.MasterJobStatusTimestamp,js.MasterJobStatus
FROM SelectedKeys SK JOIN vw_Jobs_List J WITH (NOLOCK) ON j.JobNumber=SK.JobNumber JOIN tbl_SYSTEM_MasterJobStatus js WITH (NOLOCK) ON j.MasterJobStatusID=js.MasterJobStatusID
ORDER BY
SK.JobNumber DESC
END
--ELSE IF für die Sortierung anderer Spalten
quelle
CASE
Erzeugt diese ( -basierte) Lösung nicht auch einen schlechten Ausführungsplan? Wird diesCASE
nicht für jede Zeile ausgewertet?