2008-09-22 5 views
20

ईजी।क्या आईडी के संग्रह को ADO.NET SQL पैरामीटर के रूप में भेजना संभव है?

public void InactiveCustomers(IEnumerable<Guid> customerIDs) 
{ 
    //... 
    myAdoCommand.CommandText = 
     "UPDATE Customer SET Active = 0 WHERE CustomerID in (@CustomerIDs)"; 
    myAdoCommand.Parameters["@CustomerIDs"].Value = customerIDs; 
    //... 
} 

एक ही रास्ता मैं जानता हूँ कि मेरी IEnumerable शामिल होने के लिए और उसके बाद स्ट्रिंग संयोजन का उपयोग अपने एसक्यूएल स्ट्रिंग का निर्माण करना है: मैं इस कोड की तरह कुछ लिख सकते हैं।

उत्तर

17

आम तौर पर आप ऐसा करने का तरीका मानों की अल्पविराम से अलग सूची में पास करना चाहते हैं, और अपनी संग्रहीत प्रक्रिया के भीतर, सूची को पार्स करें और इसे एक अस्थायी तालिका में डालें, जिसका उपयोग आप जुड़ने के लिए कर सकते हैं। एसक्यूएल सर्वर 2005 के रूप में, यह उन मानकों से निपटने के लिए मानक अभ्यास है जिन्हें सरणी रखने की आवश्यकता है।

यहाँ इस समस्या से निपटने के विभिन्न तरीकों पर एक अच्छा लेख है:

Passing a list/array to an SQL Server stored procedure

लेकिन Sql सर्वर 2008 के लिए, हम अंततः, प्रक्रियाओं में तालिका चर पारित करने के लिए पहले के रूप में तालिका को परिभाषित करते हुए मिल एक कस्टम प्रकार।

Introduction to New T-SQL Programmability Features in SQL Server 2008

+2

http://www.sommarskog.se/arrays-in-sql-2005.html और http://www.sommarskog.se/arrays-in-sql-2000.html संदर्भ इस विषय पर पढ़े गए हैं। वे व्यास की तुलना में अधिक विस्तार से पेशेवरों और विपक्षों पर भी चर्चा करते हैं। –

+0

एसक्यूएल सर्वर 2008 के लिए ई। सोमरस्कॉग के आलेखों का एक नया संस्करण भी है (जो तालिका-मूल्यवान पैरामीटर्स पर केंद्रित है): http://www.sommarskog.se/arrays-in-sql-2008.html। मुझे लगता है कि @ RemusRusanu की टिप्पणी अपने उत्तर का हकदार है; मैंने ऐसा पोस्ट किया है: http://stackoverflow.com/a/31110710/240733 – stakx

-3

नहीं। पैरामीटर्स first normal form का पालन करने में एसक्यूएल मानों की तरह हैं, मूल रूप से, केवल एक ही हो सकता है ...

जैसा कि आप शायद जानते हैं, SQL स्ट्रिंग्स उत्पन्न करना जोखिम भरा व्यवसाय है: आप स्वयं को SQL injection attack पर खुलते हैं। जब तक आप पूरी तरह से GUID के साथ काम कर रहे हों, आपको ठीक होना चाहिए, लेकिन अन्यथा आपको अपने इनपुट को साफ करना सुनिश्चित करना होगा।

-3

आप एक एकल एसक्यूएल पैरामीटर के रूप में एक सूची पास नहीं कर सकते हैं। आप स्ट्रिंग कर सकते हैं। जॉइन (',') GUIDS जैसे कि "0000-0000-0000-0000, 1111-1111-1111-1111" लेकिन यह डेटाबेस ओवरहेड और उप-इष्टतम पर वास्तव में उच्च होगा। और आपको पूरी स्ट्रिंग को एकल समेकित गतिशील कथन के रूप में पास करना होगा, आप इसे पैरामीटर के रूप में नहीं जोड़ सकते हैं।

प्रश्न:

आप कहाँ आईडी से निष्क्रिय ग्राहकों का प्रतिनिधित्व करते हैं की अपनी सूची मिल रहा है?

मेरा सुझाव समस्या से थोड़ा अलग तरीके से संपर्क करना है। , कुछ डेटाबेस में वह सब तर्क ले जाएँ की तरह:

Create procedure usp_DeactivateCustomers 
    @inactive varchar(50) /*or whatever values are required to identify inactive customers*/ 
    AS  
    UPDATE Customer SET c.Active = 0 
    FROM Customer c JOIN tableB b ON c.CustomerID = b.CustomerID 
    WHERE b.someField = @inactive 

और एक संग्रहीत प्रक्रिया के रूप में यह कहते हैं:

public void InactiveCustomers(string inactive) 
{ 
    //... 
    myAdoCommand.CommandText = 
     "usp_DeactivateCustomers"; 
    myAdoCommand.Parameters["@inactive"].Value = inactive; 
    //... 
} 

तो एक डेटाबेस में GUID के अस्तित्व की एक सूची है, क्यों की आवश्यकता है करने के लिए: उन्हें खोजें; उन्हें एक सामान्य सूची में डाल दें; एक सीएसवी/एक्सएमएल/टेबल वैरिएबल में सूची को खोलें, बस उन्हें वापस डीबी में पेश करने के लिए ????? वे पहले से ही वहाँ हैं! क्या मैं कुछ भूल रहा हूँ?

+0

आपके उत्तर में पहले वक्तव्य के कारण डाउनवॉटेड, जो आम तौर पर सत्य नहीं है। मैं आपके प्रश्न के अंत में सुझावों से सहमत हूं, हालांकि ... कुछ मामलों में, यह वास्तव में डीबी में सबकुछ करना संभव हो सकता है, इसलिए सूचियों को स्थानांतरित करने की समस्या कभी भी उत्पन्न नहीं हो सकती है। – stakx

5

SQL 2008 साथ आप कर सकते हैं:

इस लेख में यह (और अधिक 2008 सुविधाओं) का अच्छा वर्णन है। यह बहुत लंबा नहीं रहा है, लेकिन यह उपलब्ध है।

1

आप एक्सएमएल पैरामीटर प्रकार का उपयोग कर सकते हैं:

CREATE PROCEDURE SelectByIdList(@productIds xml) AS 

DECLARE @Products TABLE (ID int) 

INSERT INTO @Products (ID) SELECT ParamValues.ID.value('.','VARCHAR(20)') 
FROM @productIds.nodes('/Products/id') as ParamValues(ID) 

SELECT * FROM 
    Products 
INNER JOIN 
    @Products p 
ON Products.ProductID = p.ID 

http://weblogs.asp.net/jgalloway/archive/2007/02/16/passing-lists-to-sql-server-2005-with-xml-parameters.aspx

2

रूप in a comment उल्लेख किया गया था, Erland Sommarskog इस विषय पर लेख की एक श्रृंखला लिखा था (लिंक किए गए करने के लिए नीचे)। लेख बहुत गहन हैं और संदर्भ सामग्री के रूप में कार्य कर सकते हैं। जबकि वे एसक्यूएल सर्वर (T-SQL) के लिए विशिष्ट हैं, तकनीक उल्लेख के कुछ भी (जैसे कि एक XML डेटा प्रकार का उपयोग कर के रूप में) अन्य RDBMS के लिए काम कर सकते हैं:

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