Instead of и ошибка 8624

_oleg

Пардон за длинный скрипт, но наверное тому кто захочет помочь это поможетCREATE TABLE [dbo].[CRM_Cust] ( [CustID] [int] NOT NULL , [CustName] [varchar] (50) NOT NULL , [EmpID] [int] NOT NULL ) ON [PRIMARY]GOALTER TABLE [dbo].[CRM_Cust] WITH NOCHECK ADD CONSTRAINT [PK_CRM_Cust] PRIMARY KEY CLUSTERED ( [CustID] ) ON [PRIMARY] go CREATE UNIQUE INDEX [in_UniqName] ON [dbo].[CRM_Cust]([CustName]) ON [PRIMARY]insert into [dbo].[CRM_Cust] (CustID, CustName, EmpID)select 1, 'ddd', 0CREATE TABLE [dbo].[CRM_ParamEstimate] ( [ParID] [int] NOT NULL , [Descr] [varchar] (50) NULL , [Weight] [real] NOT NULL , [MaxVal] [int] NOT NULL , [DefVal] [int] NOT NULL , [Prim] [varchar] (255) NULL , [TypeBit] [bit] NOT NULL , [ParentID] [int] NOT NULL ) ON [PRIMARY]GOCREATE INDEX [in_Parent] ON [dbo].[CRM_ParamEstimate]([ParentID]) ON [PRIMARY]GOinsert into [dbo].[CRM_ParamEstimate] (ParID, Descr, Weight, MaxVal, DefVal, TypeBit, ParentID)select 1, 'Условия поставки', 0, 0, 0, 0, ************ 4, 'Доставка за счет поставщика', 0, 0, 0, 1, 1goCREATE TABLE [dbo].[CRM_CustEstimate] ( [RowID] [int] NOT NULL , [CustID] [int] NOT NULL , [ParID] [int] NOT NULL , [ValFact] [int] NOT NULL , [ValPlan] [int] NULL , [DatePlan] [smalldatetime] NULL , [Prim] [varchar] (255) NULL ) ON [PRIMARY]GO CREATE UNIQUE CLUSTERED INDEX [in_Cluster] ON [dbo].[CRM_CustEstimate]([RowID]) ON [PRIMARY]GO CREATE UNIQUE INDEX [in_Unique] ON [dbo].[CRM_CustEstimate]([CustID], [ParID]) ON [PRIMARY]GOINSERT INTO CRM_CustEstimate (RowID, CustID, ParID, ValFact, ValPlan)select 1, 1, 1, 1, ************ 2, 1, 4, 0, 0goCREATE VIEW dbo.VIEW_CRM_CustEstimatewith VIEW_METADATA ASSELECT tPar.ParID, tPar.Descr, tPar.ParentID, tPar.CustID, tCE.ValFact, tCE.ValPlan, tCE.DatePlan, tCE.Prim, casewhen tPar.TypeBit = 1 and isnull (tCE.ValFact, 0) = 1 then 1when tPar.TypeBit = 1 and isnull (tCE.ValFact, 0) = 0 then 0else nullend as flgFact,casewhen tPar.TypeBit = 1 and isnull (tCE.ValPlan, 0) = 1 then 1when tPar.TypeBit = 1 and isnull (tCE.ValPlan, 0) = 0 then 0else nullend as flgPlan,tCE.RowIDfrom (select ParID, Descr, ParentID, TypeBit, CustID FROM (select ParID, Descr, ParentID, TypeBit from dbo.CRM_ParamEstimate WHERE ParentID <> 0) t cross JOIN (select CustID from dbo.CRM_Cust) t1) tParleft join dbo.CRM_CustEstimate tCE ON tPar.ParID = tCE.ParID and tPar.CustID = tCE.CustIDgoCREATE TRIGGER tr_UpdCustEstimate ON [dbo].[VIEW_CRM_CustEstimate] instead of UPDATEASif update (flgFact) or update (flgPlan) begin update tCE set tCE.ValFact = case when tIns.flgFact = 0 then 0 else 1 end, tCE.ValPlan = case when tIns.flgPlan = 0 then 0 else 1 end from dbo.CRM_CustEstimate tCE inner join inserted tIns on tCE.RowID = tIns.RowIDendИ затем при выполненииUPDATE VIEW_CRM_CustEstimateSET flgFact = 1WHERE (ParID = 4) AND (CustID = 1)Server: Msg 8624, Level 16, State 16, Line 1Internal SQL Server error.Так что не правильно в тригере?ЗЫMicrosoft SQL Server 2000 - 8.00.2040 (Intel X86) May 13 2005 18:33:17 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
7 ответов

_oleg

IMHO, у оптимизатора крыша съезжает. Перепишите вью так:
CREATE VIEW dbo.VIEW_CRM_CustEstimate
with VIEW_METADATA
AS
SELECT tPar.ParID, tPar.Descr, tPar.ParentID, tPar.CustID, 
tCE.ValFact, tCE.ValPlan, tCE.DatePlan, tCE.Prim, 

case
when tPar.TypeBit = <b>1</b> and isnull (tCE.ValFact, <b>0</b>) = <b>1</b> then <b>1</b>
when tPar.TypeBit = <b>1</b> and isnull (tCE.ValFact, <b>0</b>) = <b>0</b> then <b>0</b>
else null
end as flgFact,

case
when tPar.TypeBit = <b>1</b> and isnull (tCE.ValPlan, <b>0</b>) = <b>1</b> then <b>1</b>
when tPar.TypeBit = <b>1</b> and isnull (tCE.ValPlan, <b>0</b>) = <b>0</b> then <b>0</b>
else null
end as flgPlan,

tCE.RowID

from dbo.CRM_CustEstimate tCE RIGHT OUTER JOIN (select ParID, Descr, ParentID, TypeBit, CustID
FROM (select ParID, Descr, ParentID, TypeBit 
from dbo.CRM_ParamEstimate 
WHERE ParentID <> <b>0</b>) t
CROSS JOIN
(select CustID
from dbo.CRM_Cust) t1) tPar
ON 
tPar.ParID = tCE.ParID
and tPar.CustID = tCE.CustID
go


_oleg

МЕРСИ!!!Только не понимаю какая разница между left и right!? (Всегда пишу left - так удобнее код разбирать)


_oleg

Разница отражена в названии. С какой стороны брать все записи - слева или справа.


_oleg

Так наверное тоже работает:) Зачем мудрить с подзапросами? не понимаю...
CREATE VIEW dbo.VIEW_CRM_CustEstimate
with VIEW_METADATA 
AS
SELECT tPar.ParID, tPar.Descr, tPar.ParentID, tCust.CustID, 
tCE.ValFact, tCE.ValPlan, tCE.DatePlan, tCE.Prim, 
case
when tPar.TypeBit = <b>1</b> and isnull (tCE.ValFact, <b>0</b>) = <b>1</b> then <b>1</b>
when tPar.TypeBit = <b>1</b> and isnull (tCE.ValFact, <b>0</b>) = <b>0</b> then <b>0</b>
end as flgFact,
case
when tPar.TypeBit = <b>1</b> and isnull (tCE.ValPlan, <b>0</b>) = <b>1</b> then <b>1</b>
when tPar.TypeBit = <b>1</b> and isnull (tCE.ValPlan, <b>0</b>) = <b>0</b> then <b>0</b>
end as flgPlan,
tCE.RowID

from dbo.CRM_ParamEstimate tPar
cross join dbo.CRM_Cust tCust
left join dbo.CRM_CustEstimate tCE ON 
tPar.ParID = tCE.ParID and tCust.CustID = tCE.CustID
WHERE tPar.ParentID <> <b>0</b>
go


_oleg

слева или справа.


_oleg

слева или справа.
Это мне понятно. Не понятно
С какой стороны брать
Планы то одинаковые (Не исповедимы пути SQL)2WiRuc Да, коенчно :), переклинило меня видно на вложеных запросах


_oleg

Если вылетает такая ошибка, попробуй следующееset forceplan on....................тело запроса................... option (force order) set forceplan off