none
הודעת שגיאה failed because it contains a derived or constant field RRS feed

  • שאלה

  • שלום,

    יש לי סקריפט שבניתי במהלך הסקריפט אני בודק שאם קיים view  מסויים אז התנאי הוא לזרוק את ה view  לצור טבלה חדשה

    בשם של  ה view שיצרתי ולהכניס אליה נתונים . הודעת השגיאה שאני מקבל היא כמו בכותרת:

    Msg 4406, Level 16, State 1, Line 60

    Update or insert of view or function 'CurrencyConversion' failed because it contains a derived or constant field.

    השאלה למה נזרקת ההודעה שגיאה הזאת?  הרי אני לא מתכוון לעדכן את הview  מבחינתי   הוא כבר לא קיים מדוע SQL  מתייחס ל view כאילו הוא קיים?

    תודה מראש שרון.

    יום חמישי 17 פברואר 2011 13:50

תשובות

  • הי איתי,

    בדקתי את הנושא והוספת GO אכן פותרת את הבעיה.

    אני יסביר מה הייתה הבעיה,

    השגיאה שקיבלתה הייתה ב- pre completion היינו ה - Batch עוד לא רץ!!!

    הוספת GO מפרידה את הקוד לשני batch-ים:

    1. הסרה ובניה

    2. הזנת נתונים כאשר בשלב הזה הקומפילציה מזהה שמדובר בטבלה ולא ב- view ולכן אין בעיה.

    שבוע טוב


    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 20 פברואר 2011 13:30
    יום ראשון 20 פברואר 2011 07:48
  • הי,

    למה להוסיף בתוך ה- if?

    תבודד רק את החלק של ה- Insert כלומר, תוציא אותו מה- if ובינו לבין החלק הראשון ,תרשום GO.

    בהצלחה


    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 20 פברואר 2011 13:30
    יום ראשון 20 פברואר 2011 08:50
  • הי שרון,

    אין בעיה, תבדוק האם קיימת טבלה לפני הכנסת הנתונים.

    כלומר:

    if exists (select top 1 1 from sys.tables where object_id = object_id('dbo.MyTable'))
    Begin
    	Insert into dbo.MyTable values (.....)
    End
    
    יום טוב
    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 20 פברואר 2011 13:30
    יום ראשון 20 פברואר 2011 09:53
  • הי שרון,

    פקודת ה- GO מחלקת את ה script ל- batch-ים נפרדים והגדרת המשתנים היא עבור כל  Batch, עד כאן אני לא מחדש מכוון שכבר נתקלתה בהודעת השגיאה.

    מה שאתה יכול לעשות זה להכניס את התוצאה לטבלה זמנית ולקרוא את הנתון ב- batch השני, בהנחה שאתה לא מנתק את החיבור ל- DB,

    declare @x int
    set @x = 1
    Select @x As A into #Y
    Go
    
    Select A from #Y
    

     מכוון שהטבלה הזמנית חיה ברמת ה- session.

     


    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 20 פברואר 2011 13:31
    יום ראשון 20 פברואר 2011 12:57
  • הי שרון,

    אשמח מאוד, במידה ואכן הבעיה נפתרה שתסמן את ה- Post כתשובה.

    תודה ושבוע טוב

     


    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 20 פברואר 2011 13:31
    יום ראשון 20 פברואר 2011 13:12
  • הי שרון,

    תבצע את הפעולה ללא הכנסת ה- data לטבלה, זה צריך לעבור ללא בעיות, במידה וכך גם אצלך תעשה את ה- insert ב- batch חדש היינו תוסיף את ה- statment GO בין שני החלקים.

     

    זה צריך להראות כך

    1. אם קיים תמחוק את ה- view.

    2. תבנה את הטבלה החדשה.

    3. GO

    4. הכנסת נתונים.

    יכול להיות שזה יעזור

    בהצלחה


    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 20 פברואר 2011 13:30
    יום ראשון 20 פברואר 2011 07:44

כל התגובות

  • שרון,

    תוכל בבקשה לצרף את הקוד?


    Best Regards, Itai Binyamin SQL Server Group Manager Veracity Group www.Veracity-Group.com www.ItaiBinyamin.Blogspot.com
    יום חמישי 17 פברואר 2011 14:54
  • איתי שלום להלן הקוד : IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CurrencyConversion]') AND type in ('V')) BEGIN print('drop View CurrencyConversion;'); DROP VIEW [dbo].[CurrencyConversion]; END : בהמשך הקוד IF not EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CurrencyConversion]')) BEGIN print('recreate table CurrencyConversion '); IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_CurrencyConversion_Currencies1]') AND parent_object_id = OBJECT_ID(N'[dbo].[CurrencyConversion]')) ALTER TABLE [dbo].[CurrencyConversion] DROP CONSTRAINT [FK_CurrencyConversion_Currencies1]; IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_CurrencyConversion_Currencies2]') AND parent_object_id = OBJECT_ID(N'[dbo].[CurrencyConversion]')) ALTER TABLE [dbo].[CurrencyConversion] DROP CONSTRAINT [FK_CurrencyConversion_Currencies2]; CREATE TABLE [dbo].[CurrencyConversion]( [id] [int] NOT NULL, [startDate] [datetime] NOT NULL, [fromID] [tinyint] NOT NULL, [toID] [tinyint] NOT NULL, [rate] [float] NOT NULL, [active] [bit] NOT NULL, CONSTRAINT [PK_CurrencyConversion] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]; ALTER TABLE [dbo].[CurrencyConversion] WITH CHECK ADD CONSTRAINT [FK_CurrencyConversion_Currencies1] FOREIGN KEY([toID])REFERENCES [dbo].[Currencies] ([id]); ALTER TABLE [dbo].[CurrencyConversion] WITH CHECK ADD CONSTRAINT [FK_CurrencyConversion_Currencies2] FOREIGN KEY([fromID]) REFERENCES [dbo].[Currencies] ([id]); print('insert data to CurrencyConversion from taurusprod'); insert into [CurrencyConversion] (id,startDate,fromID,toID,rate,active) select id,startDate,fromID,toID,rate,case when [EndDate] IS NULL then 1 else 0 end as active FROM [taurusProd].[dbo].[CurrencyConversion] error: Msg 4406, Level 16, State 1, Line 62 Update or insert of view or function 'CurrencyConversion' failed because it contains a derived or constant field. תודה רבה מראש שרון
    יום ראשון 20 פברואר 2011 07:23
  • איתי שלום להלן הקוד : IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CurrencyConversion]') AND type in ('V')) BEGIN print('drop View CurrencyConversion;'); DROP VIEW [dbo].[CurrencyConversion]; END : בהמשך הקוד IF not EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CurrencyConversion]')) BEGIN print('recreate table CurrencyConversion '); IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_CurrencyConversion_Currencies1]') AND parent_object_id = OBJECT_ID(N'[dbo].[CurrencyConversion]')) ALTER TABLE [dbo].[CurrencyConversion] DROP CONSTRAINT [FK_CurrencyConversion_Currencies1]; IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_CurrencyConversion_Currencies2]') AND parent_object_id = OBJECT_ID(N'[dbo].[CurrencyConversion]')) ALTER TABLE [dbo].[CurrencyConversion] DROP CONSTRAINT [FK_CurrencyConversion_Currencies2]; CREATE TABLE [dbo].[CurrencyConversion]( [id] [int] NOT NULL, [startDate] [datetime] NOT NULL, [fromID] [tinyint] NOT NULL, [toID] [tinyint] NOT NULL, [rate] [float] NOT NULL, [active] [bit] NOT NULL, CONSTRAINT [PK_CurrencyConversion] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]; ALTER TABLE [dbo].[CurrencyConversion] WITH CHECK ADD CONSTRAINT [FK_CurrencyConversion_Currencies1] FOREIGN KEY([toID])REFERENCES [dbo].[Currencies] ([id]); ALTER TABLE [dbo].[CurrencyConversion] WITH CHECK ADD CONSTRAINT [FK_CurrencyConversion_Currencies2] FOREIGN KEY([fromID]) REFERENCES [dbo].[Currencies] ([id]); print('insert data to CurrencyConversion from taurusprod'); insert into [CurrencyConversion] (id,startDate,fromID,toID,rate,active) select id,startDate,fromID,toID,rate,case when [EndDate] IS NULL then 1 else 0 end as active FROM [taurusProd].[dbo].[CurrencyConversion] error: Msg 4406, Level 16, State 1, Line 62 Update or insert of view or function 'CurrencyConversion' failed because it contains a derived or constant field. תודה רבה מראש שרון
    יום ראשון 20 פברואר 2011 07:28
  • איתי שלום אני מקווה שעכשיו יצא לי יותר טוב :)

     

     

    (

     

     

    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CurrencyConversion]') AND type in ('V'))

     

    BEGIN

     

    print('drop View CurrencyConversion;');

     

    DROP VIEW [dbo].[CurrencyConversion];

     

    END

     

     

     

    :חלק ב

     

     

    IF not EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CurrencyConversion]'))

     

    BEGIN

     

    print('recreate table CurrencyConversion ');

     

    IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_CurrencyConversion_Currencies1]') AND parent_object_id = OBJECT_ID(N'[dbo].[CurrencyConversion]'))

     

    ALTER TABLE [dbo].[CurrencyConversion] DROP CONSTRAINT [FK_CurrencyConversion_Currencies1];

     

    IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_CurrencyConversion_Currencies2]') AND parent_object_id = OBJECT_ID(N'[dbo].[CurrencyConversion]'))

     

    ALTER TABLE [dbo].[CurrencyConversion] DROP CONSTRAINT [FK_CurrencyConversion_Currencies2];

     

    CREATE TABLE [dbo].[CurrencyConversion](

    [id] [int]

    NOT NULL,

    [startDate] [datetime]

    NOT NULL,

    [fromID] [tinyint]

    NOT NULL,

    [toID] [tinyint]

    NOT NULL,

    [rate] [float]

    NOT NULL,

    [active] [bit]

    NOT NULL,

     

    CONSTRAINT [PK_CurrencyConversion] PRIMARY KEY CLUSTERED

     

     

    (

    [id]

    ASC

     

    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

     

    ) ON [PRIMARY];

     

    ALTER TABLE [dbo].[CurrencyConversion] WITH CHECK ADD CONSTRAINT [FK_CurrencyConversion_Currencies1] FOREIGN KEY([toID])REFERENCES [dbo].[Currencies] ([id]);

     

    ALTER TABLE [dbo].[CurrencyConversion] WITH CHECK ADD CONSTRAINT [FK_CurrencyConversion_Currencies2] FOREIGN KEY([fromID]) REFERENCES [dbo].[Currencies] ([id]);

     

     

     

    print('insert data to CurrencyConversion from taurusprod');

     

    insert into [CurrencyConversion] (id,startDate,fromID,toID,rate,active)

     

    select id,startDate,fromID,toID,rate,case when [EndDate] IS NULL then 1 else 0 end as active

     

    FROM [taurusProd].[dbo].[CurrencyConversion]

     

     

     

    END

     

    EROR MEASSAGE :

    Msg 4406, Level 16, State 1, Line 66

    Update or insert of view or function 'CurrencyConversion' failed because it contains a derived or constant field.

     

     

     

     

    יום ראשון 20 פברואר 2011 07:36
  • הי שרון,

    תבצע את הפעולה ללא הכנסת ה- data לטבלה, זה צריך לעבור ללא בעיות, במידה וכך גם אצלך תעשה את ה- insert ב- batch חדש היינו תוסיף את ה- statment GO בין שני החלקים.

     

    זה צריך להראות כך

    1. אם קיים תמחוק את ה- view.

    2. תבנה את הטבלה החדשה.

    3. GO

    4. הכנסת נתונים.

    יכול להיות שזה יעזור

    בהצלחה


    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 20 פברואר 2011 13:30
    יום ראשון 20 פברואר 2011 07:44
  • הי איתי,

    בדקתי את הנושא והוספת GO אכן פותרת את הבעיה.

    אני יסביר מה הייתה הבעיה,

    השגיאה שקיבלתה הייתה ב- pre completion היינו ה - Batch עוד לא רץ!!!

    הוספת GO מפרידה את הקוד לשני batch-ים:

    1. הסרה ובניה

    2. הזנת נתונים כאשר בשלב הזה הקומפילציה מזהה שמדובר בטבלה ולא ב- view ולכן אין בעיה.

    שבוע טוב


    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 20 פברואר 2011 13:30
    יום ראשון 20 פברואר 2011 07:48
  • קודם כל תודה רבה על התגובה.

    שנית שאני מוסיף go  אני מקבל syntax ERROR  מנראה שאני מבצע את  הפעולה בתוך if  condition

     האם לזה יש גם פתרון?

    שרון

    יום ראשון 20 פברואר 2011 08:42
  • הי,

    למה להוסיף בתוך ה- if?

    תבודד רק את החלק של ה- Insert כלומר, תוציא אותו מה- if ובינו לבין החלק הראשון ,תרשום GO.

    בהצלחה


    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 20 פברואר 2011 13:30
    יום ראשון 20 פברואר 2011 08:50
  • אסף תודה  על התגובות המהירות ומצטער על החפירות..

    אני צריך לבצע את ההכנסה של הנתונים לטבלה  ויצירתה  רק בתנאי  ש  זרקתי את ה view    שהיה קיים 

    בגלל זה ההכנסה של הנתונים חייבת להיות בתוך if  .

    אם יש לך תשובה  לזה סבבה אם אין אז אני כבר יעקוף את הבעיה  יש לי כבר כמה רעיונות בראש  הסקריפט

    עכשיו לפחות רץ טוב בלי הודעות שגיאה  ( אחרי שהורדתי את ה insertim)

     אז תודה ויום נפלא היית לי לעזר

    שרון.

     

    יום ראשון 20 פברואר 2011 09:07
  • הי שרון,

    אין בעיה, תבדוק האם קיימת טבלה לפני הכנסת הנתונים.

    כלומר:

    if exists (select top 1 1 from sys.tables where object_id = object_id('dbo.MyTable'))
    Begin
    	Insert into dbo.MyTable values (.....)
    End
    
    יום טוב
    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 20 פברואר 2011 13:30
    יום ראשון 20 פברואר 2011 09:53
  • אסף תודה , הבעיה  נפתרה אבל יש לי עוד התקלה אחת בשבילך  שפתרתי אבל עקום,

    אם הגדרתי משתנה  למעלה ועשיתי  go  המשתנה לא תופס .... אפשר להגדיר סוג של משתנה שיתפוס גם לאחר ה go

    תודה שרון

     

    יום ראשון 20 פברואר 2011 12:00
  • הי שרון,

    פקודת ה- GO מחלקת את ה script ל- batch-ים נפרדים והגדרת המשתנים היא עבור כל  Batch, עד כאן אני לא מחדש מכוון שכבר נתקלתה בהודעת השגיאה.

    מה שאתה יכול לעשות זה להכניס את התוצאה לטבלה זמנית ולקרוא את הנתון ב- batch השני, בהנחה שאתה לא מנתק את החיבור ל- DB,

    declare @x int
    set @x = 1
    Select @x As A into #Y
    Go
    
    Select A from #Y
    

     מכוון שהטבלה הזמנית חיה ברמת ה- session.

     


    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 20 פברואר 2011 13:31
    יום ראשון 20 פברואר 2011 12:57
  • אסף תודה רבה על העזרה ואכן עזרת המון שיהיה לך יום נפלא

    שרון

    יום ראשון 20 פברואר 2011 13:00
  • הי שרון,

    אשמח מאוד, במידה ואכן הבעיה נפתרה שתסמן את ה- Post כתשובה.

    תודה ושבוע טוב

     


    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 20 פברואר 2011 13:31
    יום ראשון 20 פברואר 2011 13:12
  • אסף שלום, לחצתי על הסימן הירוק הזה בכל התגובות שלך אני מקווה שזה מספיק אם לא תגחד לי על מה ללחוץ
    יום ראשון 20 פברואר 2011 13:29
  • היי אסף לחצי על סמן כתשובה על כל התגובות שלך מקווה שזה בסדר
    יום ראשון 20 פברואר 2011 13:31
  • תודה רבה,

    הכל בסדר.

     


    אסף שלם
    יום ראשון 20 פברואר 2011 13:32