এসকিউএল স্টোরড পদ্ধতিগুলির মধ্যে গতিশীল বাছাই করা


126

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

আমি গতিশীল বাছাইয়ের কথা বলি। আমার কল্পনার জগতে এটি এমন কিছুর মতো সহজ হওয়া উচিত:

ORDER BY @sortCol1, @sortCol2

এটি নবাগত এসকিউএল এবং সঞ্চিত প্রক্রিয়া বিকাশকারীরা ইন্টারনেট জুড়ে সমস্ত ফোরামে প্রদত্ত আধ্যাত্মিক উদাহরণ । "কেন এটা সম্ভব হচ্ছে না?" তারা জানেত চাইল. অবিচ্ছিন্নভাবে, অবশেষে কেউ তাদের সংগ্রহযোগ্য প্রক্রিয়াগুলির সংকলিত প্রকৃতি, সাধারণভাবে কার্যকর করার পরিকল্পনা এবং অন্যান্য ধরণের কারণে যে কোনও প্যারামিটারটি সরাসরি কোনও দণ্ডে স্থাপন করা সম্ভব নয় সে সম্পর্কে তাদের বক্তৃতা দিতে ORDER BYএসেছিলেন।


আপনারা কেউ কেউ ইতিমধ্যে কী ভাবছেন তা আমি জানি: "ক্লায়েন্টকে বাছাই করা যাক, তবে।" স্বাভাবিকভাবেই, এটি আপনার ডাটাবেস থেকে কাজটি অফলোড করে। আমাদের ক্ষেত্রে যদিও, আমাদের ডাটাবেস সার্ভারগুলি এমনকি সময়ের 99% ঘামও ভাঙছে না এবং তারা এমনকি বহু-কোর এখনও বা সিস্টেম আর্কিটেকচারে প্রতি my মাসে ঘটে এমন অন্যান্য অগণিত উন্নতিগুলির মধ্যে নেই। একা এই কারণেই, আমাদের ডাটাবেসগুলি হ্যান্ডেল বাছাই করা কোনও সমস্যা হবে না। অতিরিক্তভাবে, ডাটাবেস খুববাছাই এ ভাল। তারা এটির জন্য অনুকূলিত হয়েছে এবং এটি সঠিকভাবে অর্জন করার জন্য বহু বছর সময় লেগেছে, এটি করার জন্য ভাষাটি অবিশ্বাস্যরূপে নমনীয়, স্বজ্ঞাত এবং সহজ এবং সর্বোপরি যে কোনও শিক্ষানবিশ এসকিউএল লেখক এটি কীভাবে করতে জানেন এবং আরও গুরুত্বপূর্ণভাবে তারা এটি সম্পাদনা করতে জানেন, পরিবর্তনগুলি করুন, রক্ষণাবেক্ষণ করুন ইত্যাদি When যখন আপনার ডাটাবেসগুলি কর আদায় করা থেকে দূরে থাকে এবং আপনি কেবল উন্নয়নের সময়টিকে সহজ করতে চান (এবং সংক্ষিপ্ত করুন!) এটি একটি সুস্পষ্ট পছন্দ বলে মনে হয়।

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

তবে এটি এমন পয়েন্টটি ফিরিয়ে আনে যে এটি সম্ভব নয় - বা বরং সহজেই নয়। পূর্ববর্তী সিস্টেমগুলির সাথে আমি গতিশীল বাছাইয়ের অবিশ্বাস্যভাবে হ্যাক করার উপায়টি করেছি। এটি সুন্দর নয়, স্বজ্ঞাত, সরল বা নমনীয়ও ছিল না এবং কয়েক সপ্তাহের মধ্যেই একজন শিক্ষানবিশ এসকিউএল লেখক হারিয়ে যেতে বসতেন। ইতিমধ্যে এটি এতটা "সমাধান" নয় বরং "জটিলতা" হিসাবে দেখা যাচ্ছে।


নিম্নলিখিত উদাহরণগুলি কোনও ধরণের সেরা অনুশীলনগুলি বা ভাল কোডিং শৈলী বা কোনও কিছু প্রকাশ করার জন্য নয়, তারা টি-এসকিউএল প্রোগ্রামার হিসাবে আমার দক্ষতার পরিচায়কও নয়। তারা যা সেগুলি এবং আমি সম্পূর্ণরূপে স্বীকার করি তারা বিভ্রান্তিকর, খারাপ ফর্ম এবং কেবল সরল হ্যাক।

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

DECLARE @sortCol1 AS varchar(20)
DECLARE @sortCol2 AS varchar(20)
DECLARE @dir1 AS varchar(20)
DECLARE @dir2 AS varchar(20)
DECLARE @col1 AS varchar(20)
DECLARE @col2 AS varchar(20)

SET @col1 = 'storagedatetime';
SET @col2 = 'vehicleid';

IF @sort = 1                -- Default sort.
BEGIN
    SET @sortCol1 = @col1;
    SET @dir1 = 'asc';
    SET @sortCol2 = @col2;
    SET @dir2 = 'asc';
END
ELSE IF @sort = 2           -- Reversed order default sort.
BEGIN
    SET @sortCol1 = @col1;
    SET @dir1 = 'desc';
    SET @sortCol2 = @col2;
    SET @dir2 = 'desc';
END

আপনি ইতিমধ্যে দেখতে পাচ্ছেন যে কীভাবে আমি যদি অন্যান্য কলামগুলি সংজ্ঞায়িত করতে আরও @ কলএক্স ভেরিয়েবল ঘোষণা করি আমি "সাজানোর" মানের উপর ভিত্তি করে সাজানোর জন্য কলামগুলি সহ সত্যই সৃজনশীল হতে পারি ... এটি ব্যবহার করার জন্য, এটি সাধারণত নীচের মতো দেখতে শেষ হয় অবিশ্বাস্যরকম অগোছালো ধারা:

ORDER BY
    CASE @dir1
        WHEN 'desc' THEN
            CASE @sortCol1
                WHEN @col1 THEN [storagedatetime]
                WHEN @col2 THEN [vehicleid]
            END
    END DESC,
    CASE @dir1
        WHEN 'asc' THEN
            CASE @sortCol1
                WHEN @col1 THEN [storagedatetime]
                WHEN @col2 THEN [vehicleid]
            END
    END,
    CASE @dir2
        WHEN 'desc' THEN
            CASE @sortCol2
                WHEN @col1 THEN [storagedatetime]
                WHEN @col2 THEN [vehicleid]
            END
    END DESC,
    CASE @dir2
        WHEN 'asc' THEN
            CASE @sortCol2
                WHEN @col1 THEN [storagedatetime]
                WHEN @col2 THEN [vehicleid]
            END
    END

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

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

ORDER BY NULL DESC, NULL, [storagedatetime] DESC, blah blah

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

তবুও করেনি হবে।


আমার প্রশ্নটি তখন: এর চেয়ে ভাল উপায় আর কি আছে?

আমি সঞ্চিত পদ্ধতি ছাড়া অন্য সমাধানগুলির সাথে ঠিক আছি, কারণ আমি বুঝতে পারি যে এটি কেবল যাওয়ার উপায় নয় be অগ্রণীত, আমি জানতে চাই যে সঞ্চিত পদ্ধতিতে কেউ এটিকে আরও ভালভাবে করতে পারে কিনা, তবে যদি তা না হয় তবে আপনি কীভাবে এএসপি.এনইটি দিয়ে ব্যবহারকারীকে ডেটা টেবিলগুলি (দ্বি-দিকনির্দেশিতভাবে,) বাছাই করে কীভাবে পরিচালনা করেন?

এবং এত দীর্ঘ প্রশ্ন (বা কমপক্ষে স্কিমিং) পড়ার জন্য আপনাকে ধন্যবাদ!

পিএস: খুশী হোন আমি আমার সঞ্চিত পদ্ধতির উদাহরণটি প্রদর্শন করিনি যা গতিশীল বাছাই, গতিশীল ফিল্টারিং / কলামগুলির পাঠ্য-সন্ধান, ROWNUMBER () ওভারের মাধ্যমে পৃষ্ঠাগুলি সমর্থন করে এবং চেষ্টা করুন ... ত্রুটিগুলিতে লেনদেন রোলব্যাকিংয়ের সাথে ধরা ... "বেহিমথ আকারের" এমনকি তাদের বর্ণনা দেওয়া শুরু করে না।


হালনাগাদ:

  • আমি গতিশীল এসকিউএল এড়াতে চাই । একটি স্ট্রিং একসাথে পার্স করা এবং এটির উপর একটি এক্সইসি চালানো প্রথম স্থানে একটি সঞ্চিত পদ্ধতি থাকার অনেক লক্ষ্যকে পরাস্ত করে। কখনও কখনও আমি ভাবছি যদিও এই জাতীয় কোনও কাজ করার পক্ষে এটি কার্যকর হবে না তবে কমপক্ষে এই বিশেষ গতিশীল বাছাইয়ের ক্ষেত্রে। তবুও, আমি যখনই ডায়নামিক এসকিউএল স্ট্রিংগুলি করি তখন আমি সর্বদা নোংরা বোধ করি - যেমন আমি এখনও ক্লাসিক এএসপি বিশ্বে বাস করি।
  • কারণ আমরা প্রথম স্থানে সঞ্চিত পদ্ধতি চান অনেক জন্য নিরাপত্তা । আমি সুরক্ষা উদ্বেগের জন্য কল করতে চাই না, কেবল সমাধানের পরামর্শ দিই। এসকিউএল সার্ভার 2005 এর সাহায্যে আমরা স্বতন্ত্রিত সঞ্চিত পদ্ধতিতে স্কিমা স্তরে অনুমতিগুলি (প্রয়োজন অনুযায়ী প্রতিটি ব্যবহারকারী ভিত্তিতে) সেট করতে পারি এবং তারপরে সরাসরি টেবিলগুলির বিরুদ্ধে কোনও প্রশ্ন অস্বীকার করতে পারি। এই পদ্ধতির উপকারিতা এবং সমালোচনা সমালোচনা সম্ভবত অন্য কোনও প্রশ্নের জন্য, তবে আবার এটি আমার সিদ্ধান্ত নয়। আমি কেবল লিড কোড বানর। :)

পড়ুন stackoverflow.com/questions/3659981/... বাই SQL সার্ভার গতিশীল অর্ডার মিশ্র datatypes সাথে - খুব
LCJ

ডায়নামিক এসকিউএল হ'ল দূরতর উপায় ... যদি [এবং এটি একটি বড় আইএফ] .. আপনার ডেটা অ্যাক্সেস স্তর কঠোর এবং আপনার গতিশীল এসকিউএল এমন একটি সিস্টেম দ্বারা উত্পন্ন হয়েছে যা নিখুঁত আকারে প্রকাশিত আরডিবিএমএস বিধি দ্বারা কঠোরভাবে প্রোগ্রাম করা হয়। একটি অ্যালগরিদম ইঞ্জিনিয়ারড ডাটাবেস আর্কিটেকচার সৌন্দর্যের জিনিস ...
হাজিকালিস্ট

উত্তর:


97

হ্যাঁ, এটি একটি বেদনা এবং আপনি যেভাবে এটি করছেন তা আমি যা করি তার সাথে একই দেখাচ্ছে:

order by
case when @SortExpr = 'CustomerName' and @SortDir = 'ASC' 
    then CustomerName end asc, 
case when @SortExpr = 'CustomerName' and @SortDir = 'DESC' 
    then CustomerName end desc,
...

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

কোড থেকে আমি যা করি তা হল পেজিং এবং বাছাই করা যাতে আমার পক্ষে কমপক্ষে @SortExprএবং এর জন্য জনবহুল মানগুলির সাথে প্রচুর পুনরাবৃত্তি না হয় @SortDir

যতক্ষণ এসকিউএল সম্পর্কিত, ডিজাইন করা এবং বিভিন্ন সঞ্চিত পদ্ধতির মধ্যে ফরম্যাটিং একই রাখুন, আপনি পরিবর্তন করতে গেলে এটি কমপক্ষে ঝরঝরে এবং স্বীকৃত।


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

1
Maintain সুরক্ষা, স্কেলাবিলিটি, কার্য সম্পাদন} এ রক্ষণাবেক্ষণ যোগ করুন} আপনার ডিবি-এর বিপরীতে গতিশীল এসকিউএল চালানোর সাথে সাথে আপনার 3 বা 4 টি অ্যাপ্লিকেশন বের হয়ে গেলে আপনি ভুল হয়ে গেছেন, বিশেষত অ্যাপসের বয়স এবং বিকাশকারীরা এগিয়ে যাওয়ার ফলে আপনি কোনও কিছুই পরিবর্তন করতে পারবেন না। এক্সিকিউটিভ এবং ডায়নামিক স্কুয়েল খারাপ।
এরিক জেড দাড়ি

কেবল এটিই --- আমরা এখানে আসার আগে আগে থেকেই করেছি, চলমান ক্লাসিক এএসপি ওয়েব অ্যাপ্লিকেশনগুলির জন্য এবং অনেকগুলি, অনেক অ্যাক্সেস ভিবি অ্যাপ্লিকেশন এখনও প্রচলন করছে। আমি মুচড়ে ফেলি এবং যে কোনও সময় রক্ষণাবেক্ষণ করতে গিয়ে যে কোনও সময় সুস্পষ্ট ভুলগুলি সংশোধন করার জন্য আপনাকে তাড়াহুড়ো করতে হবে।
শান হ্যানলি 21

1
আমি এই কাজটিই করি, আমি বাছাই করা ছাড়া, বাছাই করুন প্রকারের প্রান্তে: অর্ডার বাই ক্যাসেন WHEN বাছাই করুন = 'প্রথম নাম' তখন প্রথম নাম শেষ ASC, কেস WHEN সাজান = '-প্রথম নাম' তারপরে প্রথম নাম শেষ ডিএসসি
মাইকেল ব্রে

এটি ডিবিএ এবং সফটওয়্যার ইঞ্জিনিয়ারদের জন্য একই রকম দুঃস্বপ্ন। সুতরাং আপনার তথ্য স্কীমার উপর ভিত্তি করে অভিব্যক্তিক এসকিউএল স্টেটমেন্ট তৈরি করে এমন গতিশীল তবে কঠোর সিস্টেমগুলি সক্ষম হওয়ার পরিবর্তে আপনার কাছে হার্ডকোডযুক্ত জিব্বারিশের এই ঘৃণ্য গ্লোপ রয়েছে। এটি সর্বোত্তমভাবে খারাপ প্রোগ্রামিং।
হাইজিকেলিস্ট

23

এই পদ্ধতির দ্বারা বাছাইযোগ্য কলামগুলি ক্রমানুসারে দু'বার নকল হওয়া থেকে রক্ষা করে এবং এটি আরও কিছুটা পঠনযোগ্য আইএমও হয়:

SELECT
  s.*
FROM
  (SELECT
    CASE @SortCol1
      WHEN 'Foo' THEN t.Foo
      WHEN 'Bar' THEN t.Bar
      ELSE null
    END as SortCol1,
    CASE @SortCol2
      WHEN 'Foo' THEN t.Foo
      WHEN 'Bar' THEN t.Bar
      ELSE null
    END as SortCol2,
    t.*
  FROM
    MyTable t) as s
ORDER BY
  CASE WHEN @dir1 = 'ASC'  THEN SortCol1 END ASC,
  CASE WHEN @dir1 = 'DESC' THEN SortCol1 END DESC,
  CASE WHEN @dir2 = 'ASC'  THEN SortCol2 END ASC,
  CASE WHEN @dir2 = 'DESC' THEN SortCol2 END DESC

এটি একটি উত্তরের উত্তরের মতো মনে হয়েছিল তবে যখন
সাজানোর যোগ্য

6

ডায়নামিক এসকিউএল এখনও একটি বিকল্প। আপনার কেবলমাত্র সিদ্ধান্ত নিতে হবে যে বর্তমানে বিকল্পটি আপনার কাছে যা আছে তার চেয়ে বেশি স্বচ্ছল।

এখানে একটি নিবন্ধ যা দেখায় যে: http://www.4guysfromrolla.com/webtech/010704-1.shtml


6

আমার অ্যাপ্লিকেশনগুলি এগুলি অনেক কিছু করে তবে তারা সকলেই গতিশীলভাবে এসকিউএল তৈরি করে। তবে, আমি যখন সঞ্চিত প্রক্রিয়াগুলি নিয়ে কাজ করি তখন আমি এটি করি:

  1. সঞ্চিত পদ্ধতিটিকে এমন একটি ফাংশন করুন যা আপনার মানগুলির একটি টেবিল ফেরত দেয় - কোনও ধরণের নয়।
  2. তারপরে আপনার অ্যাপ্লিকেশন select * from dbo.fn_myData() where ... order by ...কোডটিতে একটি করুন যাতে আপনি গ্যারান্টি দিয়ে সেখানে সাজানোর ক্রমটি নির্দিষ্ট করতে পারেন।

তারপরে কমপক্ষে গতিশীল অংশটি আপনার অ্যাপ্লিকেশনে রয়েছে তবে ডাটাবেস এখনও ভারী উত্তোলন করছে।


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

1
আপনি টেবুলার ফাংশন রিটার্নিং ডেটার পরিবর্তে স্থানীয় টেবিল ভেরিয়েবল ব্যবহার করে এটি অর্জন করতে পারেন। আমি স্থানীয় টেবিলগুলিকে ফাংশনগুলির চেয়ে আরও নমনীয় মনে করি, কারণ আপনি কিছু ডিবাগ তথ্য আউটপুট করতে পারেন।
সঞ্জয় জালকে

5

একটি সঞ্চিত পদ্ধতি কৌশল (হ্যাক?) আমি নির্দিষ্ট কাজের জন্য ডায়নামিক এসকিউএল এড়াতে ব্যবহার করেছি একটি অনন্য সাজানোর কলাম থাকতে হবে। অর্থাত,

SELECT
   name_last,
   name_first,
   CASE @sortCol WHEN 'name_last' THEN [name_last] ELSE 0 END as mySort
FROM
   table
ORDER BY 
    mySort

এটি জমা দেওয়ার পক্ষে সহজ - আপনি আপনার মাইসোর্ট কলামে ক্ষেত্রগুলি একত্রে করতে পারেন, গণিত বা তারিখ ফাংশন ইত্যাদির সাথে ক্রমটি বিপরীত করতে পারেন etc.

সাধারণত, যদিও আমি এসপিএল গ্রিডভিউস বা স্কেল-সার্ভারের মাধ্যমে ডেটা পুনরুদ্ধারের পরে আমার জন্য বাছাই করতে বিল্ট-ইন বাছাইয়ের সাথে অন্যান্য অবজেক্ট ব্যবহার করি। অথবা এটি অন্তর্নির্মিত না থাকলেও - যেমন, এসপ নেটনে ডেটাবেটস ইত্যাদি।


4

এটিকে হ্যাক করতে পারেন এমন কয়েকটি উপায় রয়েছে।

পূর্বশর্ত:

  1. এসপি-তে কেবল একটি নির্বাচনী বিবৃতি
  2. কোনও বাছাই ছেড়ে দিন (বা একটি ডিফল্ট আছে)

তারপরে একটি টেম্প টেবিল inোকান:

create table #temp ( your columns )

insert #temp
exec foobar

select * from #temp order by whatever

পদ্ধতি # 2: নিজের সাথে একটি লিঙ্কযুক্ত সার্ভারটি সেট আপ করুন, তারপরে ওপেনকোয়ারি ব্যবহার করে এটি নির্বাচন করুন : http://www.sommarskog.se/share_data.html#OPENQUERY


4

তৃতীয় বিকল্প হতে পারে, যেহেতু আপনার সার্ভারে প্রচুর অতিরিক্ত চক্র রয়েছে - একটি অস্থায়ী টেবিলের মাধ্যমে বাছাই করতে কোনও সহায়ক পদ্ধতি ব্যবহার করুন। কিছুটা এইরকম

create procedure uspCallAndSort
(
    @sql varchar(2048),        --exec dbo.uspSomeProcedure arg1,'arg2',etc.
    @sortClause varchar(512)    --comma-delimited field list
)
AS
insert into #tmp EXEC(@sql)
declare @msql varchar(3000)
set @msql = 'select * from #tmp order by ' + @sortClause
EXEC(@msql)
drop table #tmp
GO

ক্যাভ্যাট: আমি এটি পরীক্ষা করে দেখিনি, তবে এটি এসকিউএল সার্ভার ২০০৫-এ "কাজ করা উচিত" (যা কলামগুলি আগাম নির্দিষ্ট না করেই ফলাফল সেট থেকে একটি অস্থায়ী টেবিল তৈরি করবে))


2

এক পর্যায়ে, সঞ্চিত পদ্ধতি থেকে সরে যাওয়া এবং এই ধরণের হ্যাকারি এড়াতে কেবল প্যারামিটারাইজড কোয়েরিগুলি ব্যবহার করা কি উপযুক্ত নয়?


1
কিছু ক্ষেত্রে সম্ভবত তারা পেরেকের উপরে স্লেজহ্যামারস হয় তবে প্রায়ই আমরা সরাসরি সঞ্চিত পদ্ধতিগুলিতে অনুমতিগুলি (বিশেষত এক্সিকিউটি) সেট করতে এবং টেবিলগুলি এমনকি SELECT- এর বিপরীতে কোনও এসকিউএল অনুসন্ধানগুলি সরাসরি অস্বীকার করতে চাই। আমি হ্যাকারিটি খুব বেশি পছন্দ করি না তবে সুরক্ষা করা আমার কল নয়।
শান হ্যানলি

1
এ কারণেই এত লোক অবজেক্ট রিলেশনাল ম্যাপিংয়ে চলেছে। বাছাইয়ের জন্য অবিচ্ছিন্ন বৃত্তাকার ট্রিপস, একই জন্য বিশাল CASE ব্লক, টোন কলামগুলিতে বুদ্ধিমান আপডেট যখন সত্যই কেবল একটি আপডেট করা প্রয়োজন, ইত্যাদি stored সুরক্ষিত স্টোরেজ পদ্ধতিগুলির জন্য একটি বিজয়ী যুক্তি remains
পিটসবার্গ ডিবিএ

আমি একটি ওআরএম (ইএফ) থেকে সঞ্চিত পদ্ধতিতে চলেছি কারণ ওআরএম পুরো পাঠ্য অনুসন্ধানে সমর্থন করে না।
রনি ওভারবি

@ রনিওভারবি পূর্ণ-পাঠ্য অনুসন্ধানটি প্রায়শই ডেডিকেটেড সমাধান দ্বারা আরও ভালভাবে পরিবেশন করা হয়, যেমন লুসিন।
হ্যাঙ্ক গে

@ হ্যাঙ্কগে আমার অদ্ভুত অনুভূতি আছে যে সত্তা কাঠামো লুসিনকে সমর্থন করে না।
রনি ওভারবি

2

আমি সম্মত, ক্লায়েন্ট পক্ষ ব্যবহার। তবে এটি প্রদর্শিত হয় যা আপনি শুনতে চান এমন উত্তর নয়।

সুতরাং এটি যেভাবে হয় নিখুঁত। আপনি কেন এটি পরিবর্তন করতে চান তা আমি জানি না বা এমনকি "আরও ভাল উপায় আছে কি?" সত্যই, এটিকে "ওয়ে" বলা উচিত। তদতিরিক্ত, এটি কাজ করে এবং এই প্রকল্পের প্রয়োজনগুলিকে ঠিক জরিমানা অনুসারে কাজ করে এবং সম্ভবত বছরের পর বছর ধরে যথেষ্ট পরিমাণে বর্ধনযোগ্য হবে। যেহেতু আপনার ডাটাবেসগুলি ট্যাক্সযুক্ত নয় এবং বাছাই করা সত্যিই সহজ তাই এটি বছরের পর বছর ধরে এভাবেই থাকা উচিত।

আমি এটি ঘাম না।


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

এটি নতুন (2.0 এবং উপরে) এর মধ্যে অন্তর্নির্মিত। নেট নিয়ন্ত্রণগুলি। অথবা আপনি নিজের তৈরি করতে পারেন এবং এটি একটি ডেটাভিউতে প্রয়োগ করতে পারেন। এমএসডিএন.মাইক্রোসফট.এইন
ডিএস

2
আমার সমস্যা তখন স্কেলাবিলিটি এবং পারফরম্যান্সগুলির মধ্যে একটি। ক্লায়েন্ট-সাইড বা ওয়েব-সার্ভার-সাইড বাছাইয়ের জন্য আপনি একবারে কোনও পৃষ্ঠায় প্রদর্শন করতে যাচ্ছেন কেবল 10 বা 15 এর পরিবর্তে সমস্ত ডেটা লোড করা প্রয়োজন। এটি দীর্ঘমেয়াদে অত্যন্ত ব্যয়বহুল, যেখানে ডাটাবেস সাজানোর ক্ষেত্রে তা নেই।
শান হ্যানলি

2

আপনি যখন বাছাই করা ফলাফলগুলি পেজ করছেন, তখন ডায়নামিক এসকিউএল একটি ভাল বিকল্প। যদি আপনি এসকিউএল ইঞ্জেকশন সম্পর্কে ভৌতিক হয়ে থাকেন তবে আপনি কলামের নামের পরিবর্তে কলাম নম্বরগুলি ব্যবহার করতে পারেন। অবতরণের জন্য নেতিবাচক মানগুলি ব্যবহার করার আগে আমি এটি করেছি। এটার মতো কিছু...

declare @o int;
set @o = -1;

declare @sql nvarchar(2000);
set @sql = N'select * from table order by ' + 
    cast(abs(@o) as varchar) + case when @o < 0 then ' desc' else ' asc' end + ';'

exec sp_executesql @sql

তারপরে আপনাকে কেবল কলামের 1 থেকে # টির মধ্যে নম্বরটি নিশ্চিত করা দরকার। এমনকি আপনি কলাম সংখ্যার একটি তালিকা এই প্রসারিত ও বিশ্লেষণ যে মত একটি ফাংশন ব্যবহার করে ints এর একটি টেবিল মধ্যে পারে এই । তাহলে আপনি এই জাতীয় ধারা দ্বারা অর্ডারটি তৈরি করবেন ...

declare @cols varchar(100);
set @cols = '1 -2 3 6';

declare @order_by varchar(200)

select @order_by = isnull(@order_by + ', ', '') + 
        cast(abs(number) as varchar) + 
        case when number < 0 then ' desc' else '' end
from dbo.iter_intlist_to_tbl(@cols) order by listpos

print @order_by

একটি অসুবিধা হ'ল আপনাকে ক্লায়েন্টের পাশের প্রতিটি কলামের ক্রমটি মনে রাখতে হবে। বিশেষত, যখন আপনি সমস্ত কলাম প্রদর্শন করবেন না বা আপনি এগুলি একটি ভিন্ন ক্রমে প্রদর্শন করবেন। ক্লায়েন্ট যখন বাছাই করতে চান, আপনি কলামের কলামের নামগুলি কলাম ক্রমে ম্যাপ করুন এবং ইনটগুলির তালিকা তৈরি করুন।


গতিশীল রিপোর্টিং কোয়েরি তৈরির জন্য আমরা sp_executesql ব্যবহার করি। খুব কার্যকর। এসকিউএল অ্যাপ্লিকেশন থেকে তৈরি করা যায় না, তবে প্যারামিটারগুলি কেবল সন্নিবেশ করা হয় যেখানে প্রয়োজন হয় এবং স্বাভাবিক হিসাবে সম্পাদন করা হয়।
জোশ স্মিটন

2

ক্লায়েন্ট পক্ষের বাছাই করার বিরুদ্ধে একটি যুক্তি হ'ল বৃহত পরিমাণের ডেটা এবং পৃষ্ঠাগুলি। একবার আপনার সারি গণনাটি আপনি সহজেই প্রদর্শন করতে পারবেন এমন কিছুর বাইরে চলে গেলে আপনি প্রায়শই স্কিপ / টেকের অংশ হিসাবে বাছাই করেন যা আপনি সম্ভবত এসকিউএল চালাতে চান।

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


1

ফলাফলগুলি - এসকিউএল এর চেয়ে গ্রিড, প্রতিবেদন ইত্যাদি প্রদর্শন করে স্টাফগুলিতে বাছাইয়ের বিষয়ে কীভাবে?

সম্পাদনা করুন:

এই উত্তরটি আগে কমেছে বলে বিষয়গুলি স্পষ্ট করতে, আমি কিছুটা বিশদভাবে বর্ণনা করব ...

আপনি বলেছিলেন যে আপনি ক্লায়েন্ট-সাইড বাছাইয়ের বিষয়ে জানেন তবে এটি পরিষ্কার করতে চান। অবশ্যই এটি আপনার কল

আমি কী উল্লেখ করতে চাই, তবে তা হ'ল এটি ক্লায়েন্ট-সাইডে করে, আপনি একবারে ডেটা টানতে সক্ষম হন এবং তারপরে আপনি যা চান তার সাথে কাজ করতে পারেন - প্রতিবার সার্ভারে একাধিক ট্রিপ পিছনে করে বনাম us সাজানো পরিবর্তন হয়।

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

আপনি ওয়েবে প্রদর্শনের জন্য যদি নতুন কোনও এএসপি.এনইটি স্টাফ ব্যবহার করেন, তবে ইতিমধ্যে অনেকগুলি জিনিস ইতিমধ্যে বেকড।

কেবল বাছাই পরিচালনা করতে কি প্রতিটি সঞ্চিত পদ্ধতিতে এত বেশি কোড যুক্ত করা মূল্যবান? আবার, আপনার কল।

আমি সেই ব্যক্তি নই যিনি শেষ পর্যন্ত এর সমর্থনের দায়িত্বে থাকবেন। তবে কলাম কীভাবে জড়িত তা নিয়ে কিছু ভাবেন যেহেতু সঞ্চিত পদ্ধতি দ্বারা ব্যবহৃত বিভিন্ন ডেটাসেটের মধ্যে কলামগুলি যুক্ত / সরানো হবে (CASE বিবৃতিতে পরিবর্তন প্রয়োজন) বা হঠাৎ দুটি কলাম দ্বারা বাছাইয়ের পরিবর্তে ব্যবহারকারী সিদ্ধান্ত নেন যে তাদের তিনটি দরকার - আপনাকে এখন এই পদ্ধতিটি ব্যবহার করে এমন আপনার স্টোর করা প্রতিটি পদ্ধতির আপডেট করতে হবে।

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


এটি সঠিক উপায়ে হবে, তবে "সর্বোত্তম উপায়" হিসাবে বিবেচিত হয় না
ডিএস

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

3
অপেক্ষা করুন, কয়েক হাজার সারি দিয়ে ফলাফল সেট সম্পর্কে কী? আপনি ক্লায়েন্টকে সেই সমস্ত ডেটা ফেরত দিতে পারবেন না। আপনাকে ডেটাবেজে পেজিং এবং বাছাই করতে হবে।
এরিক জেড দাড়ি

ইয়াদাইন, বুঝেছি। তবে একবার আপনার গ্রিডগুলির জন্য জেনেরিক সর্টর পরে, আপনি কেবল এটি আপনার সমস্ত স্টাফের জন্য ব্যবহার করেন।
কেভিন ফেয়ারচাইল্ড

এরিক, সত্য ... এরকম ক্ষেত্রে আপনার অতিরিক্ত হ্যান্ডলিং দরকার এবং এটি এসকিউএল এর মধ্যে বোধগম্য হবে। এটি সঠিক বনাম ভুল সমস্যা থেকে অনেক দূরে। কিছু ক্ষেত্রে, এটি এসকিউএল এবং কিছু ক্ষেত্রে, ক্লায়েন্টের পক্ষে বোঝা যাবে।
কেভিন ফেয়ারচাইল্ড

1

দুঃখিত আমি পার্টিতে দেরি করেছি, তবে যারা তাদের জন্য সত্যিই গতিশীল এসকিউএল এড়াতে চান, তবে এটি যে নমনীয়তাটি উপস্থাপন করতে চান তাদের জন্য এখানে আরও একটি বিকল্প রয়েছে:

ফ্লাইতে গতিশীলভাবে এসকিউএল উত্পন্ন করার পরিবর্তে, প্রতিটি সম্ভাব্য প্রকরণের জন্য একটি অনন্য প্রকল্প তৈরি করতে কোড লিখুন। তারপরে আপনি অনুসন্ধানের বিকল্পগুলি দেখতে কোডটিতে একটি পদ্ধতি লিখতে পারেন এবং কল করার জন্য এটি উপযুক্ত প্রকট চয়ন করতে পারেন।

আপনার যদি কেবল কয়েকটি ভিন্নতা থাকে তবে আপনি কেবল হাতে হাতে প্রক্সগুলি তৈরি করতে পারেন। তবে আপনার যদি অনেকগুলি বৈকল্পিকতা থাকে তবে সেগুলি সবগুলি বজায় রাখার পরিবর্তে আপনি কেবলমাত্র তাদের প্রজেক্টর জেনারেটর বজায় রাখবেন এটি সেগুলি পুনরায় তৈরি করার জন্য।

একটি অতিরিক্ত সুবিধা হিসাবে, আপনি আরও ভাল পারফরম্যান্সের জন্য আরও ভাল এসকিউএল পরিকল্পনা পাবেন এটি এটি করার জন্য।


-1

এই সমাধানটি কেবল নেট। এ কাজ করতে পারে, আমি জানি না।

আমি ধারাটি দ্বারা এসকিউএল অর্ডারে প্রাথমিক সাজানোর ক্রম সহ ডেটা সি # তে আনয়ন করি, ডেটাভিউতে সেই ডেটা রাখি, এটি একটি সেশন ভেরিয়েবলে ক্যাশে রাখি এবং পৃষ্ঠাটি তৈরি করতে এটি ব্যবহার করি।

যখন ব্যবহারকারী বাছাই করার জন্য (বা পৃষ্ঠা বা ফিল্টার) শিরোনামে কোনও কলামে ক্লিক করে, আমি ডাটাবেসে ফিরে যাই না। পরিবর্তে, আমি আমার ক্যাশেড ডেটাভিউতে ফিরে যাই এবং এর "বাছাই করুন" সম্পত্তিটি আমি গতিশীলভাবে তৈরি করি এমন একটি অভিব্যক্তিতে সেট করি, যেমন আমি এসকিউএলকে গতিশীল করি। (আমি "রোফিল্টার" সম্পত্তি ব্যবহার করে একইভাবে ফিল্টারিং করি)।

আপনি এটি আমার অ্যাপ্লিকেশন, বুগট্র্যাকার.এনইটি-র http://ifdefined.com/btnet/bugs.aspx- এর একটি ডেমোতে কাজ করতে / অনুভব করতে পারবেন feel


খুব সুন্দর! বাগ ট্র্যাকার.নেট শিলা!
ডিজিগুরু

-7

প্রয়োজন না হলে আপনার এসকিউএল সার্ভার বাছাই করা উচিত। কেন অ্যাপ্লিকেশন সার্ভার বা ক্লায়েন্ট পক্ষ বাছাই করা হয় না? এছাড়াও। নেট জেনারিক্স ব্যতিক্রমী বাছাই করে


6
স্কেল্যাবিলিটির কারণে। কয়েক হাজার সারির জন্য এটি ঠিক আছে, তবে আমি দশ হাজার নীচে টেনে নামাতে চাই না that অথবা আরও. এছাড়াও, পেজিং সম্পর্কে কি? আমি প্রায়শই কেবল যা প্রদর্শন করতে হবে তা টানতে চাই। সত্যের পরে 24056 এর 21-30 সারিগুলি বাছাই করা ভুল হবে।
শন হ্যানলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.