SQL सर्वर संग्रहीत कार्यविधि में किसी सरणी को कैसे पास करें


294

SQL सर्वर संग्रहीत कार्यविधि में किसी सरणी को कैसे पास करें?

उदाहरण के लिए, मेरे पास कर्मचारियों की एक सूची है। मैं इस सूची को तालिका के रूप में उपयोग करना चाहता हूं और इसे किसी अन्य तालिका के साथ जोड़ना चाहता हूं। लेकिन कर्मचारियों की सूची को सी # से पैरामीटर के रूप में पारित किया जाना चाहिए।


महोदय उम्मीद करते हैं कि यह लिंक आपको SQL सर्वर SP
patrick choi

जवाबों:


438

SQL सर्वर 2008 (या नया)

सबसे पहले, अपने डेटाबेस में, निम्नलिखित दो ऑब्जेक्ट बनाएं:

CREATE TYPE dbo.IDList
AS TABLE
(
  ID INT
);
GO

CREATE PROCEDURE dbo.DoSomethingWithEmployees
  @List AS dbo.IDList READONLY
AS
BEGIN
  SET NOCOUNT ON;

  SELECT ID FROM @List; 
END
GO

अब आपके C # कोड में:

// Obtain your list of ids to send, this is just an example call to a helper utility function
int[] employeeIds = GetEmployeeIds();

DataTable tvp = new DataTable();
tvp.Columns.Add(new DataColumn("ID", typeof(int)));

// populate DataTable from your List here
foreach(var id in employeeIds)
    tvp.Rows.Add(id);

using (conn)
{
    SqlCommand cmd = new SqlCommand("dbo.DoSomethingWithEmployees", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlParameter tvparam = cmd.Parameters.AddWithValue("@List", tvp);
    // these next lines are important to map the C# DataTable object to the correct SQL User Defined Type
    tvparam.SqlDbType = SqlDbType.Structured;
    tvparam.TypeName = "dbo.IDList";
    // execute query, consume results, etc. here
}

SQL सर्वर 2005

यदि आप SQL Server 2005 का उपयोग कर रहे हैं, तो मैं अभी भी XML पर एक विभाजन फ़ंक्शन की सिफारिश करूंगा। सबसे पहले, एक समारोह बनाएँ:

CREATE FUNCTION dbo.SplitInts
(
   @List      VARCHAR(MAX),
   @Delimiter VARCHAR(255)
)
RETURNS TABLE
AS
  RETURN ( SELECT Item = CONVERT(INT, Item) FROM
      ( SELECT Item = x.i.value('(./text())[1]', 'varchar(max)')
        FROM ( SELECT [XML] = CONVERT(XML, '<i>'
        + REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.')
          ) AS a CROSS APPLY [XML].nodes('i') AS x(i) ) AS y
      WHERE Item IS NOT NULL
  );
GO

अब आपकी संग्रहीत प्रक्रिया बस हो सकती है:

CREATE PROCEDURE dbo.DoSomethingWithEmployees
  @List VARCHAR(MAX)
AS
BEGIN
  SET NOCOUNT ON;

  SELECT EmployeeID = Item FROM dbo.SplitInts(@List, ','); 
END
GO

और आपके C # कोड में आपको बस सूची को पास करना होगा '1,2,3,12'...


मुझे पता है कि तालिका के मानदंड से गुजरने की विधि एक समाधान की स्थिरता को सरल बनाती है जो इसका उपयोग करता है और अक्सर एक्सएमएल और स्ट्रिंग विभाजन सहित अन्य कार्यान्वयन की तुलना में प्रदर्शन में वृद्धि हुई है।

आदानों को स्पष्ट रूप से परिभाषित किया गया है (किसी को यह अनुमान नहीं है कि यदि सीमांकक अल्पविराम या अर्ध-बृहदान्त्र है) और हमारे पास अन्य प्रसंस्करण कार्यों पर निर्भरता नहीं है जो संग्रहीत कार्यविधि के लिए कोड का निरीक्षण किए बिना स्पष्ट नहीं हैं।

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

कई समाधानों में आपको इनमें से केवल एक या यूडीटी (उपयोगकर्ता परिभाषित प्रकार) की आवश्यकता हो सकती है जिसे आप कई संग्रहीत प्रक्रियाओं के लिए फिर से उपयोग करते हैं। इस उदाहरण के साथ, सामान्य आवश्यकता आईडी पॉइंटर्स की एक सूची से गुजरना है, फ़ंक्शन नाम बताता है कि उन आईडी को किस संदर्भ का प्रतिनिधित्व करना चाहिए, प्रकार का नाम सामान्य होना चाहिए।


3
मुझे टेबल पैरामीटर आइडिया पसंद है - ऐसा कभी नहीं सोचा था - चीयर्स। स्प्लिटइंट्स () फ़ंक्शन कॉल में परिसीमन करने की आवश्यकता के लिए यह किस मूल्य का है।
नाटक

मैं टेबल पैरामीटर का उपयोग कैसे कर सकता हूं यदि केवल कॉमा से अलग किए गए स्ट्रिंग तक पहुंच हो
bdwain

@bdwain उद्देश्य को हरा देगा - आपको इसे टीवीपी में डालने के लिए पंक्तियों को तोड़ने के लिए एक स्प्लिट फ़ंक्शन का उपयोग करना होगा। अपने एप्लिकेशन कोड में इसे तोड़ दें।
हारून बर्ट्रेंड

1
@AaronBertrand प्रतिक्रिया के लिए धन्यवाद, मैं वास्तव में यह पता लगा लिया। मैं एक उप कोष्ठक में चयन का उपयोग करना होगा: SELECT [colA] FROM [MyTable] WHERE [Id] IN (SELECT [Id] FROM @ListOfIds)
JaKXz

3
@ th1rdey3 वे अंतर्निहित रूप से वैकल्पिक हैं। stackoverflow.com/a/18926590/61305
हारून बर्ट्रेंड

44

मेरे अनुभव के आधार पर, एंप्लॉयीज से एक सीमांकित अभिव्यक्ति बनाकर, इस समस्या के लिए एक मुश्किल और अच्छा समाधान है। आपको केवल ';123;434;365;'- जैसे में एक स्ट्रिंग अभिव्यक्ति बनानी चाहिए 123, 434और 365कुछ कर्मचारीआईडी ​​हैं। नीचे की प्रक्रिया को कॉल करके और इस अभिव्यक्ति को इसे पास करके, आप अपने वांछित रिकॉर्ड प्राप्त कर सकते हैं। आसानी से आप इस क्वेरी में "एक और तालिका" में शामिल हो सकते हैं। यह समाधान SQL सर्वर के सभी संस्करणों में उपयुक्त है। इसके अलावा, तालिका चर या अस्थायी तालिका का उपयोग करने की तुलना में, यह बहुत तेज और अनुकूलित समाधान है।

CREATE PROCEDURE dbo.DoSomethingOnSomeEmployees  @List AS varchar(max)
AS
BEGIN
  SELECT EmployeeID 
  FROM EmployeesTable
  -- inner join AnotherTable on ...
  where @List like '%;'+cast(employeeID as varchar(20))+';%'
END
GO

अच्छा! मैं वास्तव में इस दृष्टिकोण को पसंद करता हूं जहां मैं इंट कुंजी पर फ़िल्टर कर रहा हूं! +1
MDV2000

@ MDV2000 धन्यवाद :) स्ट्रिंग कुंजियों पर, यह भी अच्छा प्रदर्शन नहीं है क्योंकि
अंतर

मुझे खेल में देर हो गई है, लेकिन यह बहुत चालाक है! मेरी समस्या के लिए महान काम करता है।
user441058

ये अद्भुत है! मैं निश्चित रूप से इसका उपयोग करूंगा, धन्यवाद
उमर रूडर

26

अपनी संग्रहीत कार्यविधि के लिए तालिका-मूल्यवान पैरामीटर का उपयोग करें।

जब आप इसे C # से पास करते हैं तो आप SqlDb.Structured के डेटा प्रकार के साथ पैरामीटर जोड़ देंगे।

यहां देखें: http://msdn.microsoft.com/en-us/library/bb675163.aspx

उदाहरण:

// Assumes connection is an open SqlConnection object.
using (connection)
{
// Create a DataTable with the modified rows.
DataTable addedCategories =
  CategoriesDataTable.GetChanges(DataRowState.Added);

// Configure the SqlCommand and SqlParameter.
SqlCommand insertCommand = new SqlCommand(
    "usp_InsertCategories", connection);
insertCommand.CommandType = CommandType.StoredProcedure;
SqlParameter tvpParam = insertCommand.Parameters.AddWithValue(
    "@tvpNewCategories", addedCategories);
tvpParam.SqlDbType = SqlDbType.Structured;

// Execute the command.
insertCommand.ExecuteNonQuery();
}

17

आपको इसे XML पैरामीटर के रूप में पास करना होगा।

संपादित करें: आपको एक विचार देने के लिए मेरी परियोजना का त्वरित कोड:

CREATE PROCEDURE [dbo].[GetArrivalsReport]
    @DateTimeFrom AS DATETIME,
    @DateTimeTo AS DATETIME,
    @HostIds AS XML(xsdArrayOfULong)
AS
BEGIN
    DECLARE @hosts TABLE (HostId BIGINT)

    INSERT INTO @hosts
        SELECT arrayOfUlong.HostId.value('.','bigint') data
        FROM @HostIds.nodes('/arrayOfUlong/u') as arrayOfUlong(HostId)

फिर आप अपने टेबल के साथ जुड़ने के लिए टेम्प टेबल का उपयोग कर सकते हैं। हमने arrayOfUlong को डेटा की अखंडता बनाए रखने के लिए XML स्कीमा में निर्मित के रूप में परिभाषित किया है, लेकिन आपको ऐसा करने की आवश्यकता नहीं है। मैं यह सुनिश्चित करने के लिए यहां एक त्वरित कोड का उपयोग करने की सलाह दूंगा ताकि आप हमेशा लोंगों के साथ XML प्राप्त कर सकें।

IF NOT EXISTS (SELECT * FROM sys.xml_schema_collections WHERE name = 'xsdArrayOfULong')
BEGIN
    CREATE XML SCHEMA COLLECTION [dbo].[xsdArrayOfULong]
    AS N'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="arrayOfUlong">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded"
                            name="u"
                            type="xs:unsignedLong" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>';
END
GO

मुझे लगा कि कई पंक्तियों के होने पर टेबल वेरिएबल का उपयोग करना एक बुरा विचार है? इसके बजाय एक अस्थायी (# तालिका) तालिका का उपयोग करना बेहतर प्रदर्शन नहीं है?
गैंडर्स

@ सैंडर्स: मैं कहूंगा कि इसके विपरीत।
abatishchev

14

संदर्भ हमेशा महत्वपूर्ण होता है, जैसे कि सरणी का आकार और जटिलता । छोटे से मध्यम आकार की सूचियों के लिए, यहां पोस्ट किए गए कई उत्तर ठीक हैं, हालांकि कुछ स्पष्टीकरण दिए जाने चाहिए:

  • एक सीमांकित सूची को विभाजित करने के लिए, एक SQLCLR- आधारित फाड़नेवाला सबसे तेज़ है। यदि आप अपना स्वयं का लिखना चाहते हैं, तो कई उदाहरण हैं, या आप सीएलआर कार्यों के मुफ्त एसक्यूएल # पुस्तकालय को डाउनलोड कर सकते हैं (जो मैंने लिखा था, लेकिन स्ट्रिंग_प्लेट फ़ंक्शन और कई अन्य, पूरी तरह से स्वतंत्र हैं)।
  • XML- आधारित सरणियों को विभाजित करना तेज हो सकता है, लेकिन आपको विशेषता-आधारित XML का उपयोग करने की आवश्यकता है, न कि तत्व-आधारित XML (जो कि यहां के उत्तरों में दिखाया गया एकमात्र प्रकार है, हालांकि @ AaronBertrand का XML उदाहरण सबसे अच्छा है क्योंकि उसका कोड उपयोग कर रहा है। text()XML फ़ंक्शन स्प्लिट सूचियों के XML का उपयोग करने के बारे में अधिक जानकारी (यानी प्रदर्शन विश्लेषण) के लिए, फिल फैक्टर द्वारा "SQL सर्वर में सूचियों को पास करने के लिए XML का उपयोग करना" देखें
  • TVPs का उपयोग करना बहुत अच्छा है (यह मानकर कि आप कम से कम SQL Server 2008, या नए का उपयोग कर रहे हैं) क्योंकि डेटा को खरीद पर प्रवाहित किया जाता है और तालिका चर के रूप में पूर्व-पार्स और दृढ़ता से टाइप किया जाता है। ज्यादातर मामलों में, DataTableमूल संग्रह से कॉपी किए गए डेटा को मेमोरी में डुप्लिकेट करने के रूप में सभी डेटा को संग्रहीत करना । इसलिए DataTableTVPs में पास करने की विधि का उपयोग करना डेटा के बड़े सेट के लिए अच्छी तरह से काम नहीं करता है (यानी अच्छी तरह से स्केल नहीं करता है)।
  • एक्सएम या स्ट्रिंग्स की सरल सीमांकित सूची के विपरीत XML, टीवीपी की तरह ही एक से अधिक आयामी सरणियों को संभाल सकता है। लेकिन यह भी DataTableटीवीपी विधि की तरह , एक्सएमएल अच्छी तरह से स्केल नहीं करता है क्योंकि यह मेमोरी में डेटाटाइसेस को दोगुना करता है क्योंकि इसे एक्सएमएल दस्तावेज़ के ओवरहेड के लिए अतिरिक्त रूप से खाते की आवश्यकता होती है।

इन सबके साथ, यदि आपके द्वारा उपयोग किया जा रहा डेटा बड़ा है या बहुत बड़ा नहीं है, लेकिन लगातार बढ़ रहा है, तो IEnumerableटीवीपी विधि सबसे अच्छा विकल्प है क्योंकि यह डेटा को SQL सर्वर (जैसे DataTableविधि) से प्रवाहित करता है, लेकिन ऐसा नहीं करता है मेमोरी में संग्रह के किसी भी दोहराव की आवश्यकता होती है (किसी भी अन्य तरीकों के विपरीत)। मैंने इस उत्तर में SQL और C # कोड का एक उदाहरण पोस्ट किया है:

शब्दकोश हिन्दी संग्रहीत प्रक्रिया टी एसक्यूएल के लिए पास


6

Sql सर्वर में सरणी के लिए कोई समर्थन नहीं है, लेकिन कई तरीके हैं जिनके द्वारा आप संग्रहित संग्रह को पास कर सकते हैं।

  1. डिटैटेबल का उपयोग करके
  2. XML.Try का उपयोग करके अपने संग्रह को एक xml प्रारूप में रूपांतरित करना और फिर उसे संग्रहीत कार्यविधि के इनपुट के रूप में पास करना

नीचे दिए गए लिंक से आपको मदद मिल सकती है

संग्रहित प्रक्रिया में संग्रहित करना


5

मैं सभी उदाहरणों और उत्तरों के माध्यम से खोज रहा हूं कि नए टेबल प्रकार बनाने की परेशानी के बिना sql सर्वर में किसी भी सरणी को कैसे पारित किया जाए, जब तक मुझे यह linK नहीं मिला , नीचे मैंने इसे अपनी परियोजना में कैसे लागू किया:

- निम्नलिखित कोड पैरामीटर के रूप में एक एरे को प्राप्त करने और उस के मान को सम्मिलित करने के लिए जा रहा है - एक अन्य तालिका में

Create Procedure Proc1 


@UserId int, //just an Id param
@s nvarchar(max)  //this is the array your going to pass from C# code to your Sproc

AS

    declare @xml xml

    set @xml = N'<root><r>' + replace(@s,',','</r><r>') + '</r></root>'

    Insert into UserRole (UserID,RoleID)
    select 
       @UserId [UserId], t.value('.','varchar(max)') as [RoleId]


    from @xml.nodes('//root/r') as a(t)
END 

आशा हैं आप इसका आनंद ले


2
@ फ़ैज़मैन: क्लैनेस्ट का मतलब सबसे अच्छा या सबसे उपयुक्त नहीं है। एक अक्सर "साफ" कोड प्राप्त करने के लिए लचीलापन और / या "उपयुक्त" जटिलता और / या प्रदर्शन छोड़ देता है। यह उत्तर यहां "ठीक है" लेकिन केवल छोटे डेटा सेट के लिए है। यदि आने वाली सरणी @sCSV है, तो बस (यानी INSERT INTO ... से सेक्शन विभाजित करें) को विभाजित करना तेजी से होगा। XML में परिवर्तित करना CLR की तुलना में धीमा है, और विशेषता-आधारित XML वैसे भी बहुत तेज़ है। और यह एक सरल सूची है जो अभी तक एक्सएमएल या टीवीपी में गुजर रही है, जटिल सरणियों को भी संभाल सकती है। सुनिश्चित नहीं है कि एक सरल, एक बार से बचने के द्वारा क्या प्राप्त किया जाता है CREATE TYPE ... AS TABLE
सोलोमन रटज़की

5

इससे आपको मदद मिलेगी। :) अगले चरणों का पालन करें,

  1. क्वेरी डिज़ाइनर खोलें
  2. निम्न कोड को कॉपी पेस्ट करें जैसा कि यह है, यह फ़ंक्शन बनाएगा जो स्ट्रिंग को इंट में बदल देता है

    CREATE FUNCTION dbo.SplitInts
    (
       @List      VARCHAR(MAX),
       @Delimiter VARCHAR(255)
    )
    RETURNS TABLE
    AS
      RETURN ( SELECT Item = CONVERT(INT, Item) FROM
          ( SELECT Item = x.i.value('(./text())[1]', 'varchar(max)')
            FROM ( SELECT [XML] = CONVERT(XML, '<i>'
            + REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.')
              ) AS a CROSS APPLY [XML].nodes('i') AS x(i) ) AS y
          WHERE Item IS NOT NULL
      );
    GO
  3. निम्न संग्रहीत कार्यविधि बनाएँ

     CREATE PROCEDURE dbo.sp_DeleteMultipleId
     @List VARCHAR(MAX)
     AS
     BEGIN
          SET NOCOUNT ON;
          DELETE FROM TableName WHERE Id IN( SELECT Id = Item FROM dbo.SplitInts(@List, ',')); 
     END
     GO
  4. इस SP को निष्पादित करें इसका उपयोग करना exec sp_DeleteId '1,2,3,12'Id का एक स्ट्रिंग है जिसे आप हटाना चाहते हैं,

  5. आप अपनी सरणी को C # में स्ट्रिंग में परिवर्तित करते हैं और इसे एक संग्रहीत प्रक्रिया पैरामीटर के रूप में पास करते हैं

    int[] intarray = { 1, 2, 3, 4, 5 };  
    string[] result = intarray.Select(x=>x.ToString()).ToArray();

     

    SqlCommand command = new SqlCommand();
    command.Connection = connection;
    command.CommandText = "sp_DeleteMultipleId";
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("@Id",SqlDbType.VARCHAR).Value=result ;

यह कई पंक्तियों को हटा देगा, ऑल द बेस्ट


मैंने इस कॉमा को अलग-अलग पार्सिंग फ़ंक्शन का उपयोग किया है, यह छोटे डेटा-सेट के लिए काम करेगा, यदि आप इसकी निष्पादन योजना की जांच करते हैं, तो यह बड़े डेटा-सेट पर समस्या का कारण बनेगा और जहां यू को संग्रहीत प्रक्रिया में कई सीएसवी सूची में होना है
सबूर अवन

2

मुझे यह पता लगाने में बहुत समय लगा, इसलिए यदि किसी को इसकी आवश्यकता हो तो ...

यह हारून के जवाब में SQL 2005 विधि पर आधारित है, और अपने स्प्लिटइंट्स फ़ंक्शन का उपयोग करके (मैंने अभी कॉलीम परम को हटा दिया है क्योंकि मैं हमेशा कॉमा का उपयोग करूंगा)। मैं SQL 2008 का उपयोग कर रहा हूं, लेकिन मैं कुछ ऐसा चाहता था जो टाइप किए गए डेटासेट्स (XSD, TableAdapters) के साथ काम करता हो और मुझे पता है कि स्ट्रिंग परमेस उन पर काम करते हैं।

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

CREATE PROCEDURE dbo.SOExample1
    (
    @excludeIngredientsString varchar(MAX) = ''
    )
AS
    /* Convert string to table of ints */
    DECLARE @excludeIngredients TABLE (ID int)
    insert into @excludeIngredients
    select ID = Item from dbo.SplitInts(@excludeIngredientsString)

    /* Select recipies that don't contain any ingredients in our excluded table */
   SELECT        r.Name, r.Slug
FROM            Recipes AS r LEFT OUTER JOIN
                         RecipeIngredients as ri inner join
                         @excludeIngredients as ei on ri.IngredientID = ei.ID
                         ON r.ID = ri.RecipeID
WHERE        (ri.RecipeID IS NULL)

आम तौर पर, यह एक तालिका चर के लिए शामिल नहीं है, बल्कि एक अस्थायी तालिका के लिए सबसे अच्छा है। तालिका चर, डिफ़ॉल्ट रूप से, केवल एक पंक्ति दिखाई देती है, हालांकि एक चाल या दो है जिसके चारों ओर (Check @ AaronBertrand का उत्कृष्ट और विस्तृत लेख: sqlperformance.com/2014/06/t-sql-queries/… )।
सोलोमन रटज़की

1

जैसा कि दूसरों ने ऊपर उल्लेख किया है, ऐसा करने का एक तरीका यह है कि आप अपने सरणी को स्ट्रिंग में परिवर्तित करें और फिर स्ट्रिंग को SQL सर्वर के अंदर विभाजित करें।

एसक्यूएल सर्वर 2016 के रूप में, वहाँ एक तरीका है में तार विभाजित कहा जाता है

STRING_SPLIT ()

यह पंक्तियों का एक सेट देता है जिसे आप अपने टेम्‍प टेबल (या असली टेबल) में सम्मिलित कर सकते हैं।

DECLARE @str varchar(200)
SET @str = "123;456;789;246;22;33;44;55;66"
SELECT value FROM STRING_SPLIT(@str, ';')

उपज होगी:

मूल्य
-----
  123
  456
  789
  246
   22
   33
   44
   55
   66

यदि आप कट्टर होना चाहते हैं:

DECLARE @tt TABLE (
    thenumber int
)
DECLARE @str varchar(200)
SET @str = "123;456;789;246;22;33;44;55;66"

INSERT INTO @tt
SELECT value FROM STRING_SPLIT(@str, ';')

SELECT * FROM @tt
ORDER BY thenumber

आपको ऊपर के समान परिणाम देगा (कॉलम नाम "थम्बर" को छोड़कर), लेकिन क्रमबद्ध। आप किसी अन्य तालिका की तरह तालिका चर का उपयोग कर सकते हैं, इसलिए यदि आप चाहें तो आप इसे आसानी से डीबी में अन्य तालिकाओं के साथ जोड़ सकते हैं।

ध्यान दें कि STRING_SPLIT()फ़ंक्शन को पहचाने जाने के लिए आपके SQL सर्वर इंस्टॉल को संगतता स्तर 130 या उच्चतर पर होना चाहिए। आप निम्न क्वेरी के साथ अपने संगतता स्तर की जांच कर सकते हैं:

SELECT compatibility_level
FROM sys.databases WHERE name = 'yourdatabasename';

अधिकांश भाषाओं (C # सहित) में एक "जॉइन" फंक्शन होता है, जिसका उपयोग आप किसी ऐरे से स्ट्रिंग बनाने के लिए कर सकते हैं।

int[] myarray = {22, 33, 44};
string sqlparam = string.Join(";", myarray);

फिर आप sqlparamअपने पैरामीटर के रूप में ऊपर संग्रहीत प्रक्रिया में पास होते हैं।


0
CREATE TYPE dumyTable
AS TABLE
(
  RateCodeId int,
  RateLowerRange int,
  RateHigherRange int,
  RateRangeValue int
);
GO
CREATE PROCEDURE spInsertRateRanges
  @dt AS dumyTable READONLY
AS
BEGIN
  SET NOCOUNT ON;

  INSERT  tblRateCodeRange(RateCodeId,RateLowerRange,RateHigherRange,RateRangeValue) 
  SELECT * 
  FROM @dt 
END
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.