Hanya ingin tahu apakah saya dapat meminta umpan balik tentang prosedur tersimpan yang saya jalankan dan apakah ada cara yang lebih efisien untuk menangani skenario (Saya cukup yakin akan ada!).
Pada dasarnya saya memiliki satu SP yang saya panggil untuk mengembalikan daftar catatan (Pekerjaan) yang mungkin memiliki satu status atau lebih dan semacam urutan (Saya menggunakan RowNum untuk paging). Saat ini saya menggunakan DENGAN RECOMPILE karena variasi pada status dapat berubah sepanjang waktu (tergantung pada pengguna dll). Ada juga beberapa penyaringan yang terjadi.
Saya menggunakan pernyataan IF untuk dasarnya menjalankan sedikit kode yang sama dengan satu-satunya perubahan menjadi urutan sortir.
Saya kira pertanyaan saya adalah: Apakah ada cara yang lebih baik untuk melakukan ini (mungkin SP berbeda untuk status yang berbeda)? Apakah saya terlalu rumit hal-hal karena kurangnya pengetahuan (sangat mungkin) Apakah SP sebenarnya ok, tetapi memerlukan sedikit penyesuaian untuk mengurangi jumlah baris?
Saya telah menempelkan sebagian SP di bawah ini - satu-satunya perbedaan pada kode lengkap adalah pernyataan IF tambahan untuk berbagai jenis pesanan ...
Saya menghargai umpan balik apa pun.
Terima kasih sebelumnya!
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 JIKA untuk penyortiran kolom lainnya
sumber
CASE
-berbasis) menghasilkan rencana eksekusi yang buruk juga? Bukankah iniCASE
akan dievaluasi untuk setiap baris?