משיב מוביל
בעיה עם indexed view

שאלה
-
שלום לכולם,
יש לי טבלא בשם 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 שזאת תופאה ידוע, אבל אני לא מבין מה הבעיה שלו. למה זה אסור?
תודה!
תשובות
-
לזה הכוונה...
את החלק הזה
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]
- סומן כתשובה על-ידי Ivan Radchenko יום ראשון 09 פברואר 2014 16:02
כל התגובות
-
אהלן איבן
1. יש בעיה בקוד שצירפת. השאילתה השנייה לא מתאימה לראשונה ונוצרת הודעה שגיאה. הטור SubAccountId לא קיים בטבלה שלך. אולי התכוונת ב VIEW לעבוד עם הטור [SubSystemId] ?
2. אם נניח שהכוונה היתה לעבוד עם הטור [SubSystemId] אז אם תחליף את השימוש ב CAST בשימוש ב TRY_CAST גם בשאילתה עצמה, אז הכל יעבוד טוב.
[Personal Site] [Blog] [Facebook]
- נערך על-ידי pituachMVP, Moderator יום רביעי 05 פברואר 2014 14:23
- הוצע כתשובה על-ידי Eran Sharvit יום ראשון 09 פברואר 2014 13:33
-
קישור מאוד מומלץ בנושא המרות:
http://msdn.microsoft.com/en-us/library/ms191530.aspx
בקישור ניתן לראות איזה המרות מותרות ואיזה לא. ישנן המרות שמותר לבצע להן המרה לא מפורשת אבל המרה מפורשת נכשלת (לדעתי אלו המקרים היותר מוזרים ששואלים בפורומים) וישנם מקרים ששום סו של המרה לא אפשרי וכמובן יש את ההמרות המותרות בכל מצב מבחינת סוג (זה לא אומר שההמרה תמיד תצליח).
[Personal Site] [Blog] [Facebook]
-
היי רונן,
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.
-
זה בדיוק מה שהבנתי ובדיוק מה שכתבתי
אם תחליף את הפונקציה CAST בפונקציה TRY_CAST בחלק של השאילתה ולא רק בפילטר אז הכל יהיה טוב ויעבוד כמו שאתה רוצה. תבדוק
ואם אתה אחר כך הסבר למה זו ההתנהגות אז אפשר לעבור על זה גם :-) בקצרה זה קשור לסדר ניתוח פעולות.
[Personal Site] [Blog] [Facebook]
- נערך על-ידי pituachMVP, Moderator יום חמישי 06 פברואר 2014 16:55
-
לזה הכוונה...
את החלק הזה
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]
- סומן כתשובה על-ידי Ivan Radchenko יום ראשון 09 פברואר 2014 16:02
-