2013-03-14 9 views
6

में हजारों पैरामीटर के साथ तैयार स्टेटमेंट मैंने इस प्रश्न PreparedStatement IN clause alternatives? से समाधान पढ़ा था। लेकिन मेरे मामले में, मेरे पास एक खंड में लगभग 5000 पैरामीटर हैं और यह java.sql.SQLException की ओर ले जाएगा: तैयार या कॉल करने योग्य कथन में 2000 से अधिक पैरामीटर मार्कर हैं।आईएन क्लॉज

मैं

String sql = "select * from project in " + projectIds.toString() 

projectIds की तरह एक एसक्यूएल उपयोग कर रहा था एक StringBuilder जो की तरह है "(1,2,3,4 ....)" लेकिन कोड सुरक्षा रिपोर्ट है कि यह एक को जन्म दे सकता का कहना है एसक्यूएल इंजेक्षन। तो मुझे उपयोग करना है? प्लेसहोल्डर इसे टालने के लिए।

मैं

String sql = "select * from project where charindex(','+convert(varchar(max),id)+',', ?)>0"; 
statement.setString(1,projectIds.toString);//projectIds like ",1,2,3,4,".. 

का उपयोग करने की कोशिश की लेकिन यह एक गलत सिंटैक्स त्रुटि के साथ समाप्त होता है।

क्या कोई समाधान है ???

+0

आपका एसक्यूएल कुछ गलत वाक्यविन्यास, यह होना चाहिए, * CHARINDEX * लगता है गलत। सुझाव है कि आप इसे फिर से जांचें, और यदि आप कर सकते हैं तो इसे किसी अन्य तरीके से फिर से लिखें। – Minus

उत्तर

1

ऐसा करने का सबसे अच्छा तरीका एक कथन का उपयोग नहीं करना है। इसके बजाय आपको उन सभी मानों को रखना चाहिए जिन्हें आप तालिका में जांचना चाहते हैं और शामिल होने का उपयोग करें।

उदाहरण के लिए यदि आप एक स्तंभ (बुलाया आईडी) उस सूची फिर अपने बयान इस प्रकार दिखाई देगा था के साथ एक मेज था: क्योंकि एसक्यूएल सर्वर प्रदर्शन काफी अच्छा कर रहे हैं

select * 
from project 
join tablelist on project.project = tablelist.id 

यह बहुत तेजी से हो जाएगा जल्दी से जुड़ता है।


आप इसे सीटीई के साथ भी कर सकते हैं। उदाहरण के लिए:

WITH tablelist as 
(
    SELECT 1 AS id 
    UNION ALL 
    SELECT 3 
    UNION ALL 
    SELECT 4 
    UNION ALL 
    SELECT 5 
    UNION ALL 
    SELECT 6 
    UNION ALL 
    SELECT 7 
    // More if needed 
) 
select * 
from project 
join tablelist on project.project = tablelist.id 

इसे एक बड़ी क्वेरी के रूप में भेजा जा सकता है और काम करेगा। आपकी एकमात्र सीमा एक क्वेरी का अधिकतम आकार होगा, मुझे नहीं पता कि ऐसी सीमा मौजूद है या नहीं।

+0

असल में, मेरे पास डेटाबेस तक अद्यतन पहुंच नहीं है। हमारे पास 2 डेटाबेस हैं, ए एक अन्य ऐप के लिए डेटाबेस है, जिसमें हमारे पास अपडेट एक्सेस नहीं है, और बी हमारा अपना डेटाबेस है। मैं डेटाबेस ए में उन परियोजना आईडी के लिए डेटाबेस ए से नवीनतम डेटा पुनर्प्राप्त करना चाहता हूं। कोई सुझाव ?? –

+0

@WangWei - हाँ, ऊपर देखें। – Hogan

2

इसके बजाय तालिका का उपयोग करने के लिए होगन का सुझाव एक अच्छा है। केवल एक चीज जो मैं बदलूंगा वह क्वेरी है, क्योंकि JOIN तालिकासूची में प्रत्येक मान के लिए एक पंक्ति उत्पन्न करता है। इसके बजाय (अपने स्तंभ नाम पर अनुमान लगा)

select * from project 
where projectID in (select id from tablelist) 

या

where exists (select 1 from tablelist where id = projectID) 
+0

कृपया टिप्पणी देखें कि मैंने होगन को जवाब दिया था। Thx –

+0

यदि डेटाबेस ए और बी एक ही सर्वर पर हैं, तो आप अनुमति दे सकते हैं यदि आप अनुमतियों की व्यवस्था कर सकते हैं। आप एक वैश्विक अस्थायी तालिका में भी डाल सकते हैं। वास्तव में, डीबीए आपको बेवकूफ बाधाओं को खड़ा नहीं करने में मदद करनी चाहिए।सबसे खराब मामला, आप एक स्ट्रिंग में गुजर सकते हैं, इसके ऊपर charindex या कुछ के साथ लूप, मान वैरिएबल में मान डालें, और शामिल हों। –

+0

जॉइन एक पंक्ति का उत्पादन नहीं करता है, यह एक आंतरिक शामिल था ... एक बाएं जुड़ाव ऐसा करेगा। मैंने बाएं जुड़ने का उपयोग नहीं किया। \ – Hogan

1

select * from project in " + projectIds.toString()

तरह

select * from project where id in (" + projectIds + ")"; 
संबंधित मुद्दे