এসকিউএল সার্ভার ২০০৮ (বা আরও নতুন)
প্রথমে আপনার ডাটাবেসে নিম্নলিখিত দুটি বস্তু তৈরি করুন:
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
আপনি যদি এসকিউএল সার্ভার 2005 ব্যবহার করেন তবে আমি এক্সএমএল এর পরে একটি বিভক্ত ফাংশনটি সুপারিশ করব। প্রথমে একটি ফাংশন তৈরি করুন:
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
এবং আপনার সি # কোডে আপনাকে কেবল তালিকাটি পাস করতে হবে '1,2,3,12'
...
আমি দেখতে পাই যে টেবিলের মূল্যবান পরামিতিগুলির মধ্য দিয়ে যাওয়ার পদ্ধতিটি কোনও সমাধানের রক্ষণাবেক্ষণকে সহজতর করে যা এটি ব্যবহার করে এবং প্রায়শই এক্সএমএল এবং স্ট্রিং বিভাজন সহ অন্যান্য বাস্তবায়নের তুলনায় কর্মক্ষমতা বাড়িয়ে তোলে।
ইনপুটগুলি স্পষ্টভাবে সংজ্ঞায়িত করা হয়েছে (ডিলিমিটারটি কমা বা অর্ধ-কোলন কিনা তা কারওই অনুমান করার দরকার নেই) এবং আমাদের অন্যান্য প্রসেসিং ফাংশনের উপর নির্ভরতা নেই যা সঞ্চিত পদ্ধতির কোডটি পরীক্ষা না করে সুস্পষ্ট নয়।
ইউডিটিগুলির পরিবর্তে ব্যবহারকারী সংজ্ঞায়িত এক্সএমএল স্কিমা জড়িত সমাধানগুলির সাথে তুলনা করে, এটি একই ধরণের পদক্ষেপের সাথে জড়িত তবে আমার অভিজ্ঞতাটি পরিচালনা, রক্ষণাবেক্ষণ এবং পড়ার পক্ষে অনেক সহজ কোড।
অনেকগুলি সমাধানে আপনার কেবলমাত্র এক বা এই কয়েকটি ইউডিটি (ব্যবহারকারী সংজ্ঞায়িত প্রকারের) প্রয়োজন হতে পারে যা আপনি অনেকগুলি সঞ্চিত পদ্ধতির জন্য পুনরায় ব্যবহার করেন। এই উদাহরণ হিসাবে, সাধারণ প্রয়োজনীয়তা আইডি পয়েন্টারগুলির একটি তালিকার মধ্য দিয়ে যেতে হয়, ফাংশন নামটি বর্ণনা করে যে এই আইডিগুলি কোন প্রসঙ্গে উপস্থাপন করা উচিত, টাইপের নামটি জেনারিক হওয়া উচিত।