it-swarm.asia

كيف تطلب حسب معلمة؟

أتساءل فقط ما إذا كان بإمكاني طلب بعض الملاحظات حول الإجراء المخزن الذي أقوم بتشغيله وما إذا كانت هناك طريقة أكثر فعالية للتعامل مع السيناريو (أنا متأكد تمامًا أنه سيكون هناك!).

بشكل أساسي لديّ SP الذي أتصل به لإرجاع قائمة السجلات (الوظائف) التي قد تحتوي على حالة واحدة أو أكثر وترتيب فرز (أستخدم RowNum لإجراء الترحيل). اللحظة التي أستخدمها مع RECOMPILE لأن الاختلافات في الحالات يمكن أن تتغير طوال الوقت (اعتمادًا على المستخدم وما إلى ذلك). وهناك أيضًا بعض التصفية الجارية.

أستخدم عبارة IF لتشغيل نفس الجزء الأساسي من التعليمات البرمجية مع التغيير الوحيد هو ترتيب الفرز.

أعتقد أن أسئلتي هي: هل هناك طريقة أفضل للقيام بذلك (ربما SP مختلفة لحالات مختلفة)؟ هل أفرط في تعقيد الأمور بسبب نقص المعرفة (مرجح جدًا) هل SP لا بأس به حقًا ، ولكنه يتطلب تعديلات بسيطة لتقليل عدد الأسطر؟

لقد قمت بلصق جزء من SP أدناه - الفرق الوحيد للرمز الكامل هو عبارات IF الإضافية لأوامر الفرز المختلفة ...

سأكون ممتنا لأي ملاحظات.

شكرا مقدما!

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 '%'[email protected]+'%')

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 لفرز الأعمدة الأخرى

16
VaticNZ

يمكن التعامل مع الفرز باستخدام تعبير CASE ، وهو شيء على غرار:

ORDER BY
    CASE WHEN @SortDirection = 'A' THEN
        CASE 
           WHEN @SortBy = 'JobNumber' THEN JobNumber
           WHEN @SortBy = 'JobId' THEN JobId 
        END
    END ASC
    , CASE WHEN @SortDirection = 'D' THEN
        CASE 
           WHEN @SortBy = 'JobNumber' THEN JobNumber
           WHEN @SortBy = 'JobId' THEN JobId 
        END
    END DESC

قد ترغب في إعادة النظر في OR OR حيث من المرجح أن تؤدي إلى خطط ضعيفة. واحدة من أفضل المقالات التي قرأتها تغطي هذا (والأساليب البديلة) هي شروط البحث الديناميكي في T-SQL

تحرير: بالنظر مرة أخرى إلى قائمة المعلمات ، يبدو أن عوامل التصفية الأساسية هيCustomerId وUserId. أقترح إنشاء procs اثنين ، spJobs_SelectByCustomerId و spJobs_SelectByUserId ، والتي تقوم بالتصفية حسب المعلمات الخاصة بها بحيث تلغي الشروط 'Param = 0 أو Column =Param'. أعتقد أن المعلمة المهمة التالية هيShowCompleted (بافتراض أنه بمجرد `` إنجاز '' وظيفة ما ، فإنها لا تظهر إلا إذا كانت ShowCompleted = 1) ، والتي كنت أفكر في تضمينها في الفهارس على CustomerId و UserId.

Edit2: مضحك كيف تدق هذه الأسئلة في بعض الأحيان في الجزء الخلفي من عقلك! :) عند الفهرسةShowCompleted ، هذه إحدى المناسبات استخدام عمود BIT الانتقائي المنخفض يمكن أن يكون أفضل استراتيجية . الفهارس المفلترة ينبغي أيضًا النظر فيها.

16
Mark Storey-Smith