आप इसी तरह के सवाल का जवाब यहां देखना चाहते हैं:
/programming/11329823/add-where-clauses-to-sql-dynamically-programmatically
हमने पाया है कि एक SPROC जो वैकल्पिक मापदंडों का एक गुच्छा लेता है और इस तरह से फ़िल्टर को लागू करता है:
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) लेकिन अगर हम इसे वैकल्पिक मापदंडों (जैसे @optionalParam1 = NULL, @optionalParam2 = 42) के एक अलग सेट से गुजारें तो यह गलत होगा । (और जाहिर है हम कैश्ड प्लान का प्रदर्शन चाहते हैं, इसलिए WITH RECOMPILEबाहर है)
यहां अपवाद यह है कि यदि वैकल्पिक पैरामीटर के अलावा, क्वेरी पर कम से कम एक MANDATORY फ़िल्टर है जो अत्यधिक चयनात्मक और ठीक अनुक्रमित है, तो उपरोक्त PROC ठीक प्रदर्शन करेगा।
हालाँकि, यदि सभी फ़िल्टर वैकल्पिक हैं, बल्कि भयानक सत्य यह है कि पैरामीटराइज्ड डायनामिक sql वास्तव में बेहतर प्रदर्शन करता है (जब तक कि आप N नहीं लिखते हैं। वैकल्पिक मापदंडों के प्रत्येक क्रमपरिवर्तन के लिए अलग-अलग स्थैतिक PROCS)।
नीचे की तरह गतिशील एसक्यूएल क्वेरी मापदंडों के प्रत्येक क्रमपरिवर्तन के लिए एक अलग योजना बनाएगा और कैश करेगा, लेकिन कम से कम प्रत्येक योजना विशिष्ट क्वेरी के लिए 'अनुरूप' होगी (इससे कोई फर्क नहीं पड़ता कि यह एक पीआरसी या एडहॉक एसक्यूएल है - जैसा कि जब तक वे प्रश्नों के पैरामीटर हैं, उन्हें कैश किया जाएगा)
तो इसलिए मेरी प्राथमिकता:
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 में पास करते हैं तो कोई बात नहीं है - उन्हें नजरअंदाज कर दिया जाता है। यह ध्यान देने योग्य है कि ORM जैसे Linq2SQL और EF एक समान तरीके से पैरामीटराइज्ड डायनामिक sql का उपयोग करते हैं।