در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

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

#پارامترهای_نوع_آرایه_در_sql_server #بانک_اطلاعاتی_sql_server #ارسال_مقادیر_آرایه_به_function #ارسال_مقادیر_به_sp #فیلتر_اطلاعات_در_sql_server
1 نظر
حمیدرضا صادقیان

سلام.

نکته قشنگی رو بیان کردید. ولی یک راه ساده تر این هست که یک متغیر از نوع Table تعریف کنید و در پارامتر SP یا Function از اون متغیر استفاده کنید.

به راحتی میتوانید روی این متغیر مثل یک جدول Select بزنید با Where اونو فیلتر کنید و مثل یک جدول عادی باهاش رفتار کنید.

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

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....