حسین احمدی
بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

آموزش ارسال مقادیر به صورت آرایه به Stored Procedure و Function

چگونه مقادیر را در قالب آرایه به SP و Function در SQL ارسال کنیم؟ بعضی اوقات پیش میاد که بخواییم مقادیری رو به عنوان پارامتر به Function ها یا Stored Procedure ها در SQL Server ارسال کنیم. مشکل اینجاست که SQL Server نوع داده ای برای دریافت آیتم ها به صورت آرایه نداره. برای این کار، می توان از راهکار زیر استفاده کرد. فرض کنیم که بانک ما جدولی با ساختار زیر دارد:

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
CREATE TABLE People
(
	[Id] INT IDENTITY NOT NULL PRIMARY KEY,
	[Name] NVARCHAR(200) NOT NULL,
	[Age] SMALLINT NOT NULL
);
GO

حال می خواهیم Stored Procedure ای بنویسیم که مقادیر این جدول را برای برگرداند و قابلیت فیلتر بر اساس Name را نیز داشته باشد. برای اینکار یک SP ایجاد می کنیم که و نام آن را GetPeople میگذاریم. شیوه ای که میخواهیم این SP را اجرا کنیم به صورت زیر است:

exec GetPeople @names

اگر پارامتر names از نوع NULL بود کل اطلاعات جدول را برگردانده و اگر مقدار داشت، بر اساس نام های وارد شده اطلاعات را برگرداند:

1. exec GetPeople NULL
2. exec GetPeople 'Saeed,Hossein'

دستور اول همه سطرها و دستور دوم فقط ستون هایی که نام های Hossein و Saeed را دارند بر می گرداند.

برای اینکار ابتدا یه Function به نام Split تعریف می کنیم که پارامتری از نوع رشته را دریافت کرده و یک جدول شامل مقادیر جدا شده برای ما بر می گرداند:

create function dbo.Split
(
    @String varchar(max)
)
returns @SplittedValues table
(
    Id varchar(50) primary key
)
as
begin
    declare @SplitLength int, @Delimiter varchar(5)
    
    set @Delimiter = ','
    
    while len(@String) > 0
    begin 
        select @SplitLength = (case charindex(@Delimiter,@String) when 0 then
            len(@String) else charindex(@Delimiter,@String) -1 end)
 
        insert into @SplittedValues
        select substring(@String,1,@SplitLength) 
    
        select @String = (case (len(@String) - @SplitLength) when 0 then  ''
            else right(@String, len(@String) - @SplitLength - 1) end)
    end 
return  
end

بعد باید SP مورد نظر برای گرفتن اطلاعات را بنویسیم:

create procedure GetPeople
	@names nvarchar(500)
as
select 
	* 
from 
	People
where
	(@names is null or Name in (select * from Split(@names)))

با این کار ما قابلیت ارسال چند مقدار به صورت پارامتر به SP یا Function را خواهیم داشت.


حسین احمدی
حسین احمدی

بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ...

نظرات