2011-08-11 14 views
10

मैं कल उपयोगकर्ता समूह की बैठक में था और उन्होंने बताया कि पैरामीटरयुक्त प्रश्नों का उपयोग क्वेरी को हरकोड करने से बेहतर है। यही कारण है कि मुझे सोच को मिला, इस (हालांकि इस की तुलना में काफी बड़े पैमाने पर स्पष्ट रूप से) कुछ भी लाभकारी क्या करता है:इन दो प्रश्नों के बीच सर्वोत्तम अभ्यास

DECLARE @Client1 UNIQUEIDENTIFIER, 
@Client2 UNIQUEIDENTIFIER 
SET @ClientId1 ='41234532-2342-3456-3456-123434543212'; 
SET @ClientId2 = '12323454-3432-3234-5334-265456787654'; 

SELECT ClientName 
FROM dbo.tblclient 
WHERE id IN (@Client1,@Client2) 

के रूप में करने का विरोध किया:

SELECT ClientName 
FROM dbo.tblclient 
WHERE id IN ('41234532-2342-3456-3456-123434543212','12323454-3432-3234-5334-265456787654') 
+2

क्या आप स्पष्ट कर सकते हैं कि बेहतर द्वारा प्रश्न की पहली वाक्य में क्या मतलब है। मैं [माँ के शोषण] से परिचित हूं (http://xkcd.com/327/) लेकिन मैं कुछ अन्य दावों के बारे में कुछ संदेहजनक हूं। –

उत्तर

4

पैरामैट्रिज्ड प्रश्न और IN खंड वास्तव में समय-समय पर परिवर्तनों की सूची में आपके IN सूची परिवर्तनों को लागू नहीं किया जाता है। Parameterize an SQL IN clause

पैरामीटर, डिजाइन द्वारा, केवल एक ही मूल्य हैं:

इस तो सवाल और उत्तर पढ़ें। SQL Injection जैसे सुरक्षा मुद्दों को ध्यान में रखते हुए, इसके अलावा अन्य सभी को मैन्युअल रूप से कार्यान्वित किया जाना चाहिए।

एक प्रदर्शन परिप्रेक्ष्य से, आप parametrized प्रश्नों के लिए बेहतर प्रदर्शन करेंगे, विशेष रूप से यदि एक ही क्वेरी बार-बार चलती है, लेकिन विभिन्न पैरामीटर मानों के साथ। हालांकि, यदि आपके पास गतिशील IN सूची है (कभी-कभी 2 आइटम, कभी-कभी 3), तो आपको parametrized प्रश्नों का उपयोग करने का लाभ नहीं मिल सकता है।

हालांकि आशा खोना न करें। कुछ लोग इसे लागू करने में सक्षम हैं (पैरामैट्रिज्ड प्रश्न और IN खंड)। हालांकि, यह फिर से तुच्छ नहीं है।

1

यह चोट नहीं करना चाहिए, लेकिन आप ' उपयोगकर्ता इनपुट द्वारा जेनरेट किए गए प्रश्नों का उपयोग करते समय तैयार वक्तव्यों से सबसे अधिक प्रभाव प्राप्त करने जा रहे हैं। यदि वे "सभी दिखाएं" के लिए एक बटन पर क्लिक कर रहे हैं, तो यह एक बड़ा सौदा नहीं है; हालांकि, यदि आप किसी उपयोगकर्ता को अपना नाम दर्ज करने के लिए संकेत दे रहे हैं, तो आपको डालने/अपडेट करने/चयन करने से पहले इनपुट को पैरामीटर करने की गंभीरता से आवश्यकता है।

उदाहरण के लिए, यदि मैंने अपना नाम "माइक ड्रॉप टेबल मास्टर" के रूप में दर्ज किया है; " या आपके डीबी में जो भी बड़ा टेबल नाम है, यह आपके लिए वास्तव में बदसूरत हो सकता है। क्षमा से बेहतर सुरक्षित, है ना?

संपादित करें: ओपी ने यहां टिप्पणी की और एक प्रश्न पूछा। एक कोड उदाहरण के साथ अद्यतन किया गया।

public int myNum; 
SqlParameter spNum=new SqlParameter("@myNum", SqlDbType.Int); 
//you can also check for null here (but not really relevant in this case) 
command.Parameters.Add(spNum); 
string sql="INSERT INTO Table(myNum)"; 
sql+=" VALUES(@myNum)"; 
command.CommandText = sql; 
int resultsCt = command.ExecuteNonQuery(); 

देखें कि कोड इनपुट के लिए एक पूर्णांक होने के लिए मजबूर कर रहा है इससे पहले कि यह डेटाबेस के साथ कोई काम करता है? इस तरह यदि कोई भी किसी शेंगेनियों की कोशिश करता है तो इसे डीबी को नुकसान पहुंचाने से पहले अस्वीकार कर दिया जाता है।

+0

मुझे लगता है कि वह एक एसक्यूएल इंजेक्शन जोखिम से अधिक प्रदर्शन परिप्रेक्ष्य से पूछ रहा है। – JNK

+0

आह। अगर ऐसा है तो मैं हटा दूंगा। स्पष्टीकरण के लिए धन्यवाद। – rownage

+0

ओपी तक, ईमानदारी से। सिर्फ सवाल से मुझे क्या मिला। – JNK

1

विशाल डेटाबेस और जटिल प्रश्नों पर डेटाबेस में शामिल होने के साथ डेटाबेस निष्पादन योजना का समय उपयोग कर सकता है। पैरामीटरयुक्त प्रश्नों का उपयोग करते समय निष्पादन योजना कुछ समय के लिए क्वेरी कैश में कई बार कॉल करने पर डेटाबेस कैश में रहता है

संबंधित मुद्दे