2009-03-06 11 views
13

मैं कैसे एक संग्रहीत प्रक्रिया है कि है कि मैं लिख सकता है मुझे (उदाहरण के लिए) पारित करने के लिए अनुमति देगा एक @IDList तो निर्माण कर सकते हैं:पासिंग एक संग्रहीत प्रक्रिया के माध्यम से सूची "में"

Select * from Foo Where ID in @IDList 

यह संभव है?

+0

कौन सा डेटाबेस का उपयोग कर रहे के रूप में एक DataTable में गुजर कोड से कहते हैं? आप किस भाषा से सूची उत्तीर्ण कर रहे हैं? – bstoney

उत्तर

0

तालिका बी में अलग-अलग आईडी लिखें, सभी एक ही "कुंजी" (शायद एक GUID) के साथ लिखें।
फिर, तालिका ए के खिलाफ आपकी क्वेरी को शामिल किया जाएगा

where ID in (select ID from B where key = @TempKey) 

(इसके बाद आप कुंजी अगर आप उन्हें समाप्त करने के बाद हटा सकते हैं। या, उन्हें टाइमस्टैम्प और यह करने के बाद में एक एसक्यूएल काम किया है।)

सकारात्मक:

  • आप एक स्ट्रिंग है, जो आपको कुछ परिस्थितियों में इंजेक्शन sQL के बेनकाब कर सकता है न भेजें।
  • आपके अन्य ऐप तर्क के आधार पर, आपको एक ही बार में संभावनाओं को ट्रैक या लिखना नहीं है।

विपक्ष:

  • यह अत्यंत अकुशल, विशेष रूप से भारी लोड के तहत हो सकता है।
11

SQL2005 के साथ और आप सीधे कोड से एक सरणी भेज सकते हैं इसके बाद के संस्करण।

पहले एक कस्टम प्रकार

CREATE TYPE Array AS table (Item varchar(MAX)) 

संग्रहीत प्रक्रिया से पैदा करते हैं।

CREATE PROCEDURE sp_TakeArray 
    @array AS Array READONLY 
AS BEGIN 
    Select * from Foo Where ID in (SELECT Item FROM @array) 
END 

तब सरणी

DataTable items = new DataTable(); 
items.Columns.Add("Item", typeof(string)); 

DataRow row = items.NewRow(); 
row.SetField<string>("Item", <item to add>); 
items.Rows.Add(row); 

SqlCommand command = new SqlCommand("sp_TakeArray", connection); 
command.CommandType = CommandType.StoredProcedure; 
SqlParameter param = command.Parameters.Add("@Array", SqlDbType.Structured); 
param.Value = items; 
param.TypeName = "dbo.Array"; 

SqlDataReader reader = command.ExecuteReader(); 
+0

यह केवल एसक्यूएल सर्वर 2008 पर लागू है। –

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