تا %60 تخفیف خرید برای 5 نفر با صدور مدرک فقط تا
00 00 00
در توسینسو تدریس کنید

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

بعضی اوقات پیش میاد که بخواییم مقادیری رو به عنوان پارامتر به 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 را خواهیم داشت.

نظر شما
برای ارسال نظر باید وارد شوید.
1 نظر
افرادی که این مطلب را خواندند مطالب زیر را هم خوانده اند
تنظیمات حریم خصوصی
تائید صرفنظر