كيف تمرر مصفوفة إلى الإجرائيات المخزنة باستخدام دالة :
بصراحة كنت بحاجة ماسة لتمرير مصفوفات إلى إجراء مخزن فقمت بإنشاء الدالة التالية , و قد أحببت أن أشارك بها
عسى و لعل أن تكون مفيدة :
الطريقة المستخدمة في هذه الدالة هي تمرير المصفوفة إلى الدالة على شكل سلسلة يفصل بين عناصرها محرف
تحدده بنفسك على أن يكون هذا المحرف غير مستخدم في قيم السلاسل و تقوم هذه الدالة بإعادة جدول مؤلف من حقلين :
رقم تعريفي و عنصر المصفوفة .
لاحظ ما سوف تفعله الدالة :
SELECT * FROM
dbo.SplitIntoTable('GHUG,HJGFTR,AW,OU,7656,P' , ',')
----------------------
ID | strVal
----------------------
0 | GHUG
1 | HJGFTR
2 | AW
3 | OU
4 | 7656
5 | Pالآن و ببساطة يمكنك أن تمرر مؤشر بسيط على الجدول الذي تعيده هده الدالة لتستخدم عناصر المصفوفة :
create function SplitIntoTable ( @statement nvarchar(2000) , @separator nvarchar(10) ) RETURNS @Table Table(id int, strVal nvarchar(2000)) as begin if(@statement = '')or(@separator = '') GoTo End_Prepare_Fields declare @i int , @i1 int select @i1 = 1 , @i = CHARINDEX (@separator, @statement , 1) if(@i = 0) begin if(RTRim(LTRim(@statement)) = '') Insert Into @Table Values(0 , Null) else Insert Into @Table Values(0 , @statement ) end else Begin declare @val nvarchar(100) , @counter int select @val = '' , @i = -1 , @i1 = 0 ,@counter = 0 while (@i <> 0) begin set @i1 = @i + 1 select @i = CHARINDEX (@separator, @statement , @i + 1) if(@i - @i1)> 0 set @val = substring(@statement , @i1 , @i - @i1) else set @val = substring(@statement , @i1 , len(@statement)- @i1 + 1) if(@val = '') Insert Into @Table Values(@counter , Null) else Insert Into @Table Values(@counter , @val) set @counter = @counter + 1 end end End_Prepare_Fields: return end
--------------------------------------
يمكننا الان الوصول إلى كل عنصر من المصفوفة باستخدام مؤشر على النحو التالي :
Declare c cursor for
SELECT * FROM
dbo.SplitIntoTable('GHUG,HJGFTR,AW,OU,7656,P' , ',')
declare @id int , @el nvarchar(2000)
fetch next from c into @id , @el
while @@fetch_status = 0
Begin
Print @el
fetch next from c into @id , @el
End
Close c
Deallocate cالمبرمج عماد .. B) B)