نمایش نتایج 1 تا 7 از 7

نام تاپیک: پیدا کردن تمامی فرزندان یک والد !

  1. #1

    پیدا کردن تمامی فرزندان یک والد !

    سلام .

    من جدولی دارم با فیلدهای زیر :

    SID : شماره گره

    SPID : شماره والد

    SNAme : نام گره

    حال میخواهم تابعی در خود SQLServer بنویسم که با دریافت یک شماره گره (SID) ، تمامی فرزندان آن گره را در صورت وجود در یک جدول برگرداند !

    جستجوی زیادی در وب کردم ، ولی به نتیجه مطلوب هنوز نرسیده ام !

    البته تابع برعکس اش را دارم که با گرفتن شماره یک فرزند ، تمامی والدهای آنرا تحت جدولی برمیگرداند !

    لطفاً کمک بفرمایید .

  2. #2

    نقل قول: پیدا کردن تمامی فرزندان یک والد !

    بنده با استفاده از پست : http://www.barnamenevis.org/sh...66&postcount=6

    و اعمال تغییراتی در آن به کد زیر رسیدم که دقیقاً نیاز من را بر طرف میکند :
    ALTER PROC tree (@nodeID INT) AS
    BEGIN
    ;WITH cte AS
    (SELECT SID, SPID
    FROM Structure
    WHERE SPID = @nodeID
    UNION ALL
    SELECT t.SID, t.SPID
    FROM cte
    JOIN Structure t
    ON t.SPID = cte.SID)
    SELECT SID + ''
    FROM cte

    END


    ولی دو مشکل دارم :

    1 - اول اینکه این یک SP هستش و من بلد نیستم اونرو به تابع تبدیل کنم ! البته نمیدونم امکانش هست یا نه ؟

    2 - و دوم اینکه میخوام این کد شماره گره ورودی به خودش رو هم برگردونه ! در حالیکه فعلاً فقط فرزندان اونرو برمیگردونه !

  3. #3

    نقل قول: پیدا کردن تمامی فرزندان یک والد !

    از اساتید کسی نیست کمکی بکنه ؟؟؟

  4. #4

    نقل قول: پیدا کردن تمامی فرزندان یک والد !

    شما دو جدول را در نظر بگیر جدول گره(s) (sid,sname) و جدول والد(sp)(spid,sid,spname) که sid در جدول والد کلید خارجی برای sid درجدول گره است.
    select *
    from sp
    where exists (select *
    from s
    where sid='your choice'
    and s.sid=sp.sid)

  5. #5

    نقل قول: پیدا کردن تمامی فرزندان یک والد !

    ولی دو مشکل دارم :

    1 - اول اینکه این یک SP هستش و من بلد نیستم اونرو به تابع تبدیل کنم ! البته نمیدونم امکانش هست یا نه ؟

    2 - و دوم اینکه میخوام این کد شماره گره ورودی به خودش رو هم برگردونه ! در حالیکه فعلاً فقط فرزندان اونرو برمیگردونه !
    سلام،
    برای سوال اول، چون کوئری مجموعه را بر میگرداند نمی توانید از توابع معمولی Scalar برای خروجی دادن استفاده کنید در این حالت می تونید یک TVF ایجاد کنید. که در عبارت SELECT از آن استفاده کنید.

    برای سوال دوم باید در SELECT اولی به در ماده ی WHERE به جای SPID باید SID قرار بدین تا گره ی ریشه هم انتخاب بشه.
    وبلاگ من (Advanced SQL Querying)

  6. #6

    نقل قول: پیدا کردن تمامی فرزندان یک والد !

    در این حالت می تونید یک TVF ایجاد کنید
    بنده هیچ اطلاعاتی در مورد TVF ندارم ! لطفاً بیشتر توضیح دهید و نحوه استفادشو بفرمایید .

    در ضمن بنده با کلی کلنجار رفتن با SQL ، تابع زیر را نوشتم که فعلاً به نظر من کار مورد نظر را انجام میدهد ! تا نظر اساتید چی باشه ؟؟؟

    Create FUNCTION ReadAllChilds
    (
    @Sid int
    )
    RETURNS @Ret TABLE
    (
    Depth int primary key IDENTITY(1,1),
    Sid int NOT NULL,
    Sname nvarchar(50)
    )
    as
    begin

    WITH cte AS


    (SELECT SID, SPID ,SName
    FROM Structure
    WHERE SID = @Sid
    UNION ALL
    SELECT SID, SPID ,SName
    FROM Structure
    WHERE SPID = @Sid
    UNION ALL
    SELECT t.SID, t.SPID, t.SName
    FROM cte
    JOIN Structure t
    ON t.SPID = cte.SID)


    INSERT INTO @Ret ([sid], [SName])
    SELECT distinct [sid],[SName] FROM CTE;


    return;
    end

  7. #7

    نقل قول: پیدا کردن تمامی فرزندان یک والد !

    TVF دقیقه همان چیزی است که دارین ازش استفاده می کنید یعنی table-valued function. البته TVF به دو نوع تقسیم می شه. Inline و multistatement که شما از نوع دوم استفاده کردین.

    برای استفادش:
    SELECT * FROM ReadAllChilds(@Sid) --end
    وبلاگ من (Advanced SQL Querying)

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •