Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

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

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

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

// 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
}

एसक्यूएल सर्वर 2005

यदि आप SQL सर्वर 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' . के रूप में पास करना होगा ...

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

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

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

<ब्लॉकक्वॉट>

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SCHEMA_NAME () SQL सर्वर में कैसे काम करता है

  2. कॉलम dbo या उपयोगकर्ता-परिभाषित फ़ंक्शन या कुल dbo.Splitfn नहीं मिल रहा है, या नाम अस्पष्ट है

  3. SQL सर्वर (T-SQL) से HTML ईमेल कैसे भेजें

  4. एक चुनिंदा कॉलम के मूल्य को स्टोर करना और अगले के लिए इसका इस्तेमाल करना संभव है?

  5. SQL सर्वर में TSQL और GUI द्वारा तालिका में पहचान कॉलम कैसे जोड़ें - SQL सर्वर / T-SQL ट्यूटोरियल भाग 40