none
החזרת user defined table מפונקציה RRS feed

  • שאלה

  • יצרתי type בשם details ואני מעוינת שפונקציה תחזיר מסוג הtype שיצרתי.


    ALTER FUNCTION [dbo].[fn_GetDetails] (@domainId INT)
    RETURNS dbo.details
    WITH SCHEMABINDING AS
    BEGIN
      DECLARE @domDetails AS dbo.details ;
      RETURN @domDetails;
    END;

    אני מקבלת שגיאה Must declare the scalar variable "@domDetails".

    כשאני מחליפה את dbo.details ב-int זה מתקמפל בהצלחה.

    האם אין אפשרות להחזיר מפונקציה user defined table?

    יום ראשון 18 ינואר 2015 10:30

תשובות

  • ערב טוב,

    אם אתה רוצה להחזיר סוג (TYPE) שמתאים למבנה טבלאי, ואתה מעביר אותו אל הפונקציה כ table value parameter, אז הדרך הכי קלה ובדרך כלל הנכונה היא פשוט ליצור פונקציה טבלאית שתקבל INPUT של המשתנה שלך ותחזיר טבלה שכוללת את התוכן של הסוג שלך. את התוצאה אחר כך אתה יכול להכניס למשתנה מהסוג החדש שייצרת (אפשר לבצע את הכל בפונקציה אחת, או לבצע את השלב הראשון בפונקציה ואת השלב הני מחוץ לפונקציה).

    משתנה מסוג table value parameter שמועבר לפרוצדורה חייב להיות מועבר כ READONLY מה שאומר שאנחנו לא יכולים לשנות אותו. אם תנסה לשנות אותו אז תקבל הודעת שגיאה, ואם תנסה להעביר אותו לא כ READONLY אז ... שוב... הודעת שגיאה.

    יש אפשרויות שונות לפתרון, אבל אני צריך לראות את הדוגמה הספציפית שאתה מנסה לבצע ולא לערוך דיון כללי תיארטי אם רוצים פתרון מעשי :-) אם תוכל לצרך דוגמה מעשית עם DDL+DML של מה שיש עד כה, והסבר של מה מועבר פונקציה ומה חוזר מבחינתך, אז נוכל למצוא את הפתרון שמתאיםם לך ככל הנראה.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    • נערך על-ידי pituachMVP, Editor יום ראשון 25 ינואר 2015 17:17
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 27 ינואר 2015 10:21
    יום ראשון 25 ינואר 2015 17:15
    מנחה דיון

כל התגובות

  • בקרוב מומחי הקהילה ינסו לסייע.

    תודה.


    מיקרוסופט מציעה שירות זה ללא תשלום, למטרת סיוע למשתמשים והעשרת הידע הקשור בטכנולוגיות ובמוצרים של מיקרוסופט. תוכן זה מתפרסם כפי שהוא והוא אינו מעיד על כל אחריות מצד מיקרוסופט.

    יום רביעי 21 ינואר 2015 13:32
  • ערב טוב,

    אם אתה רוצה להחזיר סוג (TYPE) שמתאים למבנה טבלאי, ואתה מעביר אותו אל הפונקציה כ table value parameter, אז הדרך הכי קלה ובדרך כלל הנכונה היא פשוט ליצור פונקציה טבלאית שתקבל INPUT של המשתנה שלך ותחזיר טבלה שכוללת את התוכן של הסוג שלך. את התוצאה אחר כך אתה יכול להכניס למשתנה מהסוג החדש שייצרת (אפשר לבצע את הכל בפונקציה אחת, או לבצע את השלב הראשון בפונקציה ואת השלב הני מחוץ לפונקציה).

    משתנה מסוג table value parameter שמועבר לפרוצדורה חייב להיות מועבר כ READONLY מה שאומר שאנחנו לא יכולים לשנות אותו. אם תנסה לשנות אותו אז תקבל הודעת שגיאה, ואם תנסה להעביר אותו לא כ READONLY אז ... שוב... הודעת שגיאה.

    יש אפשרויות שונות לפתרון, אבל אני צריך לראות את הדוגמה הספציפית שאתה מנסה לבצע ולא לערוך דיון כללי תיארטי אם רוצים פתרון מעשי :-) אם תוכל לצרך דוגמה מעשית עם DDL+DML של מה שיש עד כה, והסבר של מה מועבר פונקציה ומה חוזר מבחינתך, אז נוכל למצוא את הפתרון שמתאיםם לך ככל הנראה.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    • נערך על-ידי pituachMVP, Editor יום ראשון 25 ינואר 2015 17:17
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 27 ינואר 2015 10:21
    יום ראשון 25 ינואר 2015 17:15
    מנחה דיון
  • הפונקציה שלי נראית כך:

    ALTER FUNCTION [dbo].[fn_GetDomainDetails] (@domainId INT)
    RETURNS dbo.details
    WITH SCHEMABINDING AS
    BEGIN
      DECLARE @details AS dbo.details ;
      RETURN @details;
    END;

    כאשר אני מגדירה את details@ כInt ואת הפוקציה כפונקציה שמחזירה int- זה מתקפל ללא שגיאות

    אבל כשאני רוצה להשתמש בtype שנקרא dbo.details שאני יצרתי אני מקבלת את השגיאה המדוברת.

    dbo.details מוגדר כך:

    CREATE TYPE [dbo].[details] AS TABLE(
    [domainId] [int] NOT NULL,
    [adminName] [nvarchar](100) NULL,
    [adminMail] [nvarchar](100) NULL,
    [adminEndMail] [nvarchar](100) NULL,
    [registerName] [nvarchar](100) NULL,
    [registerMail] [nvarchar](100) NULL,
    [registerEndMail] [nvarchar](100) NULL,
    [phone] [nvarchar](100) NULL,
    [address] [nvarchar](100) NULL,
    [adsense] [nvarchar](100) NULL,
    [googleAnalytics] [nvarchar](100) NULL,
    [affiliate] [nvarchar](100) NULL
    )

    אשמח אם תוכל להתייחס באופן ספציפי לקוד שלי

    תודה רבה

    יום חמישי 05 פברואר 2015 08:47