আপনি এই জাতীয় প্রশ্নের উত্তরটি এখানে দেখতে চাইতে পারেন:
/programming/11329823/add-where-clauses-to-sql-dynamically-programically
আমরা খুঁজে পেয়েছি যে একটি স্প্রোক যা aচ্ছিক পরামিতিগুলির একগুচ্ছ গ্রহণ করে এবং ফিল্টারটিকে এভাবে প্রয়োগ করে:
CREATE PROC MyProc (@optionalParam1 NVARCHAR(50)=NULL, @optionalParam2 INT=NULL)
AS
...
SELECT field1, field2, ... FROM [Table]
WHERE
(@optionalParam1 IS NULL OR MyColumn1 = @optionalParam1)
AND (@optionalParam2 IS NULL OR MyColumn2 = @optionalParam2)
এটি প্রথম প্রয়োগকারী পরিকল্পনাকে ক্যাশে করবে (উদাহরণস্বরূপ @optionalParam1 = 'Hello World', @optionalParam2 = NULL
) এটি দিয়ে চালানো হয় তবে আমরা যদি এটি iseচ্ছিক প্যারামিটারগুলির একটি পৃথক সেট (উদাহরণস্বরূপ @optionalParam1 = NULL, @optionalParam2 = 42
) পাস করি তবে খারাপভাবে সঞ্চালন করুন । (এবং স্পষ্টতই আমরা ক্যাশেড পরিকল্পনার পারফরম্যান্স চাই, তাই WITH RECOMPILE
বাইরে)
এখানে ব্যতিক্রমটি হ'ল ifচ্ছিক প্যারামিটারগুলি ছাড়াও যদি কোয়েরিতে ALSO কমপক্ষে একটি পৃথক ফিল্টার থাকে যা উচ্চতর নির্বাচনী এবং সঠিকভাবে সূচকযুক্ত হয়, তবে উপরোক্ত PROC জরিমানা সম্পাদন করবে।
যাইহোক, যদি সমস্ত ফিল্টারগুলি alচ্ছিক হয় তবে এর চেয়ে ভয়াবহ সত্যটি হ'ল প্যারামিটারাইজড ডায়নামিক এসকিউএল আসলে আরও ভাল পারফর্ম করে (যদি না আপনি এন! লিখেন statচ্ছিক প্যারামিটারগুলির প্রতিটি অনুক্রমের জন্য বিভিন্ন স্ট্যাটিক প্রোসিএস)।
নীচের মতো গতিশীল এসকিউএল কোয়েরি প্যারামিটারগুলির প্রতিটি অনুক্রমের জন্য একটি পৃথক পরিকল্পনা তৈরি এবং ক্যাশে করবে, তবে কমপক্ষে প্রতিটি পরিকল্পনা নির্দিষ্ট ক্যোয়ারির জন্য 'উপযুক্ত' হবে (এটি কোনও প্রোসি বা অ্যাডহক এসকিউএল কিনা তা বিবেচনা করে না) - যতক্ষণ তারা প্যারামিটারাইজড কোয়েরি হয় ততক্ষণ তাদের ক্যাশে রাখা হবে)
সুতরাং এর জন্য আমার পছন্দ:
DECLARE @SQL NVARCHAR(MAX)
-- Mandatory / Static part of the Query here
SET @SQL = N'SELECT * FROM [table] WHERE 1 = 1'
IF @OptionalParam1 IS NOT NULL
BEGIN
SET @SQL = @SQL + N' AND MyColumn1 = @optionalParam1'
END
IF @OptionalParam2 IS NOT NULL
BEGIN
SET @SQL = @SQL + N' AND MyColumn2 = @optionalParam2'
END
EXEC sp_executesql @SQL,
N'@optionalParam1 NVARCHAR(50),
@optionalParam2 INT'
,@optionalParam1 = @optionalParam1
,@optionalParam2 = @optionalParam2
ইত্যাদি। যদি আমরা sp_executesql এ অনর্থক পরামিতিগুলিতে পাস করি তবে তাতে কিছু আসে যায় না - সেগুলি উপেক্ষা করা হয়। এটি লক্ষণীয় যে ওআরএম এর মতো লিনক টু এসকিউএল এবং ইএফ প্যারামিটারাইজড ডায়নামিক এসকিএল একইভাবে ব্যবহার করে।