مدتها بود كه كار يكي از گزارشاتم لنگ يك كوئري ريكرسيو (اس كيو ال) بود و من از ترس پيچيدگي زيادش جرات نداشتم بهش نزديك بشم. ولي فشار مشتري منو مجبور كرد كه اين كار رو بكنم. موثقترين منبع در اينترنت براي انجام اين كار مقالهاي در ام اس دي ان به نام Recursive Queries Using Common Table Expressions در اين آدرس. اين مقاله با كمك مفهوم common table expression سعي دارد يك كوئري ريكرسيو بنويسد. مقاله خيلي خوب است ولي نياز من خيلي سادهتر از اين بود. من فقط ميخواستم از يك جدول كه يك ساختار درختي را در خود نگه ميداشت و شامل يك كليد به خودش بود اطلاعات سادهاي مثل بالاترين parent را استخراج كنم. خوشبختانه يكي از همكاران بنده قبلا روي چنين موضوعي كار كرده و يك Stored Procedure براي اين كار نوشته بود. من هم با كمك اين sp يك User Defined Function نوشتم كه مشابه توابع ريكرسيو معمولي در كدهاي سيشارپ و غيره عمل ميكرد. در واقع اصل قضيه اين بود كه مقاله اشاره شده در بالا سعي ميكند در داخل خود كوئري منطق ريكرسيو بودن را بگنجاند و اگر از SQL User Defined Functionها استفاده شود راه حل فوق العاده ساده ميشود. در ادامه تابع
ريكرسيو ما را ببينيد:
ريكرسيو ما را ببينيد:
CREATE FUNCTION [dbo].[GetParentID](@Id bigint)RETURNS bigintASBEGIN–تابعي براي پيدا کردن گروه مادر يک گروه دارايي–recursive query idea by Ghane–http://faraconesh.net:8080/browse/IRISL-386–usage: select id, dbo.GetParentID(id) as ‘GetParentID’,Parent_id_fk,* from Asset_AssetGroup
declare @parentId bigint Select @parentId = Parent_id_fk From Asset_AssetGroup Where ID = @Id
If (@parentId Is Null) RETURN @Id else RETURN dbo.GetParentID(@parentId)
–following RETURN never be ranRETURN -1END