none
בעיה עם indexed view RRS feed

  • שאלה

  • שלום לכולם,

    יש לי טבלא בשם  SubAccounts שיש בא שדה CustomMemberId מסוג nvarchar:

    CREATE TABLE [dbo].[SubAccounts](
    	[SubSystemId] [int] NOT NULL,
    	[CustomMemberId] [nvarchar](255) NOT NULL,
    ) ON [PRIMARY]
     

    חלק מהערכים של השדה לזה הם, למעשה, uid וחלק לא. אני יוצר indexed view רק על הערכים שהם uid ורוצה שהשדה הזה יהיה מסוג uid:

    CREATE VIEW [dbo].[View_SubAccounts] 
    WITH SCHEMABINDING
    AS
    SELECT [SubAccountId], CAST([CustomMemberId] AS UNIQUEIDENTIFIER)  [CustomMemberId]
    FROM [dbo].[SubAccounts]
    WHERE TRY_CAST([CustomMemberId] AS UNIQUEIDENTIFIER) IS NOT NULL
    GO
    CREATE UNIQUE CLUSTERED INDEX [CI_View_SubAccounts] ON [dbo].[View_SubAccounts] ([SubAccountId]);
    GO

    אחרי שאני יוצר את ה-view, אני לא מצליח להכניס ערכים ל- SubAccounts שלא ניתן להפוך אותם ל-uid:

    INSERT INTO [dbo].[SubAccounts]
               ([SubSystemId]           
               ,[CustomMemberId])
    VALUES (1,'10' )

    מצאתי ב-Google שזאת תופאה ידוע, אבל אני לא מבין מה הבעיה שלו. למה זה אסור?

    תודה!

    יום רביעי 05 פברואר 2014 12:59

תשובות

  • לזה הכוונה...

    את החלק הזה

    SELECT [SubAccountId], CAST([CustomMemberId] AS UNIQUEIDENTIFIER)  [CustomMemberId]
    FROM [dbo].[SubAccounts]
    WHERE TRY_CAST([CustomMemberId] AS UNIQUEIDENTIFIER) IS NOT NULL

    תחליף ב 

    SELECT [SubAccountId], TRY_CAST([CustomMemberId] AS UNIQUEIDENTIFIER)  [CustomMemberId]
    FROM [dbo].[SubAccounts]
    WHERE TRY_CAST([CustomMemberId] AS UNIQUEIDENTIFIER) IS NOT NULL

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


    [Personal Site] [Blog] [Facebook]signature

    • סומן כתשובה על-ידי Ivan Radchenko יום ראשון 09 פברואר 2014 16:02
    יום חמישי 06 פברואר 2014 16:55
    מנחה דיון

כל התגובות

  • אהלן איבן

    1. יש בעיה בקוד שצירפת. השאילתה השנייה לא מתאימה לראשונה ונוצרת הודעה שגיאה. הטור SubAccountId לא קיים בטבלה שלך. אולי התכוונת ב VIEW לעבוד עם הטור [SubSystemId] ?

    2. אם נניח שהכוונה היתה לעבוד עם הטור [SubSystemId] אז אם תחליף את השימוש ב CAST בשימוש ב TRY_CAST גם בשאילתה עצמה, אז הכל יעבוד טוב.


    [Personal Site] [Blog] [Facebook]signature

    • נערך על-ידי pituachMVP, Editor יום רביעי 05 פברואר 2014 14:23
    • הוצע כתשובה על-ידי Eran Sharvit יום ראשון 09 פברואר 2014 13:33
    יום רביעי 05 פברואר 2014 14:08
    מנחה דיון
  • קישור מאוד מומלץ בנושא המרות:

    http://msdn.microsoft.com/en-us/library/ms191530.aspx

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


    [Personal Site] [Blog] [Facebook]signature

    יום רביעי 05 פברואר 2014 14:12
    מנחה דיון
  • היי רונן,

    1) סליחה, טעות שלי, התכוונתי לזה:

    CREATE TABLE [dbo].[SubAccounts](
    	[SubAccountId] [int] NOT NULL,
    	[CustomMemberId] [nvarchar](255) NOT NULL,
    ) ON [PRIMARY]
    
    
    CREATE VIEW [dbo].[View_SubAccounts] 
    WITH SCHEMABINDING
    AS
    SELECT [SubAccountId], CAST([CustomMemberId] AS UNIQUEIDENTIFIER)  [CustomMemberId]
    FROM [dbo].[SubAccounts]
    WHERE TRY_CAST([CustomMemberId] AS UNIQUEIDENTIFIER) IS NOT NULL
    GO
    CREATE UNIQUE CLUSTERED INDEX [CI_View_SubAccounts] ON [dbo].[View_SubAccounts] ([SubAccountId]);
    GO
    
    INSERT INTO [dbo].[SubAccounts]
               ([SubAccountId]           
               ,[CustomMemberId])
    VALUES (1,'10' )
    2) זה בכלל לא מה ששאלתי. ברור לי שהיא אפשר להמיר '10' ל-uid, אבל אני גם לא רוצה שהיא תכנס ל-view, זה בדיוק הנקודה. אני רוצה שב-view השדה CustomMemberId יהיה מסוג uid ולא nvarchar. 


    יום חמישי 06 פברואר 2014 16:14
  • זה בדיוק מה שהבנתי ובדיוק מה שכתבתי

    אם תחליף את הפונקציה CAST בפונקציה TRY_CAST בחלק של השאילתה ולא רק בפילטר אז הכל יהיה טוב ויעבוד כמו שאתה רוצה. תבדוק

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


    [Personal Site] [Blog] [Facebook]signature

    יום חמישי 06 פברואר 2014 16:47
    מנחה דיון
  • לזה הכוונה...

    את החלק הזה

    SELECT [SubAccountId], CAST([CustomMemberId] AS UNIQUEIDENTIFIER)  [CustomMemberId]
    FROM [dbo].[SubAccounts]
    WHERE TRY_CAST([CustomMemberId] AS UNIQUEIDENTIFIER) IS NOT NULL

    תחליף ב 

    SELECT [SubAccountId], TRY_CAST([CustomMemberId] AS UNIQUEIDENTIFIER)  [CustomMemberId]
    FROM [dbo].[SubAccounts]
    WHERE TRY_CAST([CustomMemberId] AS UNIQUEIDENTIFIER) IS NOT NULL

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


    [Personal Site] [Blog] [Facebook]signature

    • סומן כתשובה על-ידי Ivan Radchenko יום ראשון 09 פברואר 2014 16:02
    יום חמישי 06 פברואר 2014 16:55
    מנחה דיון
  • כן, זה עובד! מוזר, כי הייתי בטוח שזה הדבר הראשון שניסיתי לעשות...

    תודה רבה!

    יום ראשון 09 פברואר 2014 16:02