আপনি কীভাবে কোনও পরামিতি অর্ডার করবেন?


16

আমি ভাবছি যে আমি যে স্টোরেজ পদ্ধতিতে চলছি সে সম্পর্কে কিছু প্রতিক্রিয়া জানতে পারি এবং পরিস্থিতি পরিচালনার আরও কার্যকর উপায় আছে কিনা (আমি অবশ্যই নিশ্চিত যে সেখানে আসবে!)।

মূলত আমার কাছে একটি একক এসপি রয়েছে যা আমি রেকর্ডগুলির একটি তালিকা (জবস) ফিরিয়ে আনার জন্য কল করি যার মধ্যে এক বা একাধিক স্ট্যাটাস এবং একটি সাজানোর অর্ডার থাকতে পারে (আমি পেজিংয়ের জন্য রোউনাম ব্যবহার করছি)। এই মুহুর্তে আমি রিকম্পিলে ব্যবহার করছি কারণ স্ট্যাটাসগুলির প্রকরণগুলি সর্বদা পরিবর্তিত হতে পারে (ব্যবহারকারীর উপর নির্ভর করে)। কিছু ফিল্টারিং চলছে।

আমি একই আইটেমটি একই বিট কোডটি চালানোর জন্য আইএফ স্টেটমেন্টটি ব্যবহার করছি কেবলমাত্র সাজানোর ক্রম হিসাবে change

আমার অনুমান আমার প্রশ্নগুলি হ'ল: এটি করার আরও ভাল উপায় কি আছে (বিভিন্ন স্ট্যাটাসের জন্য বিভিন্ন এসপি হতে পারে)? আমি কি জ্ঞানের অভাবে জিনিসগুলিকে অতিরিক্ত জটিল করে তুলছি (বেশিরভাগ সম্ভাবনা) এসপি কি আসলেই ঠিক আছে, তবে লাইনের সংখ্যা হ্রাস করার জন্য ছোটখাটো টুইটগুলি দরকার?

আমি নীচে এসপির একটি অংশ পেস্ট করেছি - সম্পূর্ণ কোডের সাথে একমাত্র পার্থক্য হ'ল বিভিন্ন সাজানোর আদেশের জন্য অতিরিক্ত আইএফ স্টেটমেন্ট ...

আমি কোন প্রতিক্রিয়া প্রশংসা করব।

আগাম ধন্যবাদ!

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

- অন্যান্য কলাম বাছাইয়ের জন্য যদি বেলস

উত্তর:


16

বাছাইয়ের ক্ষেত্রে 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'd- এর পুনর্বিবেচনা করতে চাইতে পারেন যেখানে শর্তগুলি তাদের খারাপ পরিকল্পনা তৈরির সম্ভাবনা রয়েছে। আমি এটি পড়ার (এবং বিকল্প পদ্ধতির) সর্বোত্তম নিবন্ধগুলির মধ্যে একটি হ'ল টি-এসকিউএল-ডায়নামিক অনুসন্ধান শর্তসমূহ

সম্পাদনা: আপনার প্যারামিটার তালিকার দিকে আবার তাকালে, প্রাথমিক ফিল্টারগুলি @CustomerId এবং @UserId হিসাবে উপস্থিত হবে। আমি দুটি প্রোস, স্পোবস_স্লিটবাই কাস্টমোমার আইডি এবং এসপি জবস_স্লেক্টবাইজার আইডি তৈরির পরামর্শ দিচ্ছি, যা তাদের নিজ নিজ পরামিতিগুলি দ্বারা ফিল্টার করে যাতে আপনি '@Param = 0 বা কলাম = @ পরম' শর্তগুলি অপসারণ করতে পারেন। আমি অনুমান করি যে পরবর্তী গুরুত্বপূর্ণ পরম হ'ল @ শো কমপ্লিটেড (ধরে নেওয়া যায় যে কোনও কাজ একবার 'সম্পন্ন' হয়ে গেলে এটি @ শো কমপ্লিটড = 1 ব্যতীত প্রদর্শিত হয় না), যা আমি গ্রাহকআইডি এবং ইউজারআইডির সূচকগুলিতে অন্তর্ভুক্ত বিবেচনা করব।

সম্পাদনা 2: মজার বিষয় এই প্রশ্নগুলি কখনই আপনার মনের পিছনে টিক দেয়! :) @ শো কমপ্লিটকে ইনডেক্স করার সময় এটি এমন একটি অনুষ্ঠান যেখানে লো-সিলেক্টিভিটি বিআইটি কলাম ফার্স্ট ব্যবহার করা সেরা কৌশল হতে পারেফিল্টার সূচকগুলিও বিবেচনা করা উচিত।


Wooosh! সরাসরি আমার মাথার উপরে, তবে আমি পড়তে এবং শিখতে ভয় পাই না! সাড়া দেওয়ার জন্য সময় দেওয়ার জন্য মার্ককে ধন্যবাদ জানাই। আশ্চর্যজনকভাবে মজার বিষয় যে কীভাবে সাবকোনসিস এই বিষয়গুলির মাধ্যমে কাজ চালিয়ে যাচ্ছে। আমি বিয়ার এবং নিকোটিন
সহায়তাও

যদি কোনও বিষয়ে স্পষ্টতা প্রয়োজন হয় তবে নির্দ্বিধায় আপনার প্রশ্ন বাড়িয়ে দিন বা একটি নতুন পোস্ট শুরু করুন।
মার্ক স্টোর-স্মিথ

1
ধন্যবাদ মার্ক। আমি আপনার কয়েকটি পরামর্শ বাস্তবায়ন করেছি এবং একটি অদ্ভুত সমস্যা ব্যতীত সবই ভাল ... আমি অন্য থ্রেডে পোস্ট করেছি: dba.stackexchange.com/questions/4162/…
ভ্যাটিকএনজেড

আমার খারাপ, এটি ব্যাখ্যা করল না যে আপনাকে পৃথক কেস এক্সপ্রেশনগুলিতে বিভিন্ন ধরণের মোকাবেলা করতে হবে। আপনার নতুন প্রশ্নের উত্তর যুক্ত করেছে।
মার্ক স্টোরি-স্মিথ

এই সমাধানটি ( CASE-ভিত্তিক) খুব কম দুর্বল কার্যকর পরিকল্পনাও তৈরি করবে না ? এটি কি CASEপ্রতিটি সারির জন্য মূল্যায়ন করা হবে না ?
আন্দ্রে রিনিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.