چگونه مقادیر را در قالب آرایه به 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 را خواهیم داشت.