2

我有这样的看法:

CREATE VIEW vwView
AS
SELECT
         ac.ac_id
        ,ac.Company
        ,ac.no
        ,ac.ContractID
        ,ac.Seller
        ,ac.AcquistionDate
        ,ac.Village
        ,ac.Commune
        ,ac.Area
        ,ac.PlotArea
        ,ac.FieldNo
        ,ac.Topo1
        ,ac.Topo2
        ,ac.Topo3
        ,ac.Topo4
        ,ac.Topo5
        ,ac.TotalAreaSqm
        ,ac.OwnershipTitle
        ,ac.CadastralNO
        ,ac.Type
        ,ac.Price
        ,ac.NotaryCosts
        ,ac.LandTax
        ,ac.OtherTaxes
        ,ac.AgentFee
        ,ac.CadastralFee
        ,ac.TabulationFee
        ,ac.CertSarcini
        ,ac.ProcuraNO
        ,cast((isnull(ac.price,0)+isnull(ac.notarycosts,0)+isnull(ac.landtax,0)+isnull(ac.othertaxes,0)+isnull(ac.agentfee,0)+isnull(ac.cadastralfee,0)+isnull(ac.tabulationfee,0)+isnull(ac.certsarcini,0)) as decimal(12,4)) as TotalCosts
        ,cast((isnull(ac.price,0)+isnull(ac.notarycosts,0)+isnull(ac.landtax,0)+isnull(ac.othertaxes,0)+isnull(ac.agentfee,0)+isnull(ac.cadastralfee,0)+isnull(ac.tabulationfee,0)+isnull(ac.certsarcini,0))/(NULLIF(ac.TotalAreaSqm,0)/10000) as decimal(12,4)) as RonPerHa
        ,cast((isnull(ac.price,0)+isnull(ac.notarycosts,0)+isnull(ac.landtax,0)+isnull(ac.othertaxes,0)+isnull(ac.agentfee,0)+isnull(ac.cadastralfee,0)+isnull(ac.tabulationfee,0)+isnull(ac.certsarcini,0))/(NULLIF(ac.TotalAreaSqm, 0)/10000*NULLIF(ac.FixHist, 0)) as decimal(12,4)) as EurPerHa
        ,ac.DeclImpunere
        ,ac.FixHist
        ,cast((isnull(ac.price,0)+isnull(ac.notarycosts,0)+isnull(ac.landtax,0)+isnull(ac.othertaxes,0)+isnull(ac.agentfee,0)+isnull(ac.cadastralfee,0)+isnull(ac.tabulationfee,0)+isnull(ac.certsarcini,0))/NULLIF(ac.FixHist,0) as decimal(12,4)) as EurHist
        ,ac.LandStatus
        ,ac.Arenda

        ,UPDATE nbAchizitii set ac.Arenda=CASE WHEN ac.PlotArea=ar.PlotArea then 'yes'
                                                                            else 'no'
                                         END
        FROM    nbAchizitii ac
        LEFT JOIN nbArenda ar
        ON
        ac.PlotArea=ar.PlotArea                                                                            

我想在我的视图中包含应该动态执行的更新(它应该用是或否更新 ac.Arenda 的每一行)但我不知道应该如何将它放在视图中。有人可以帮我吗?

4

1 回答 1

1

我想在我的视图中包含应该动态执行的更新

你不能这样做。您不能UPDATE像以前那样在视图中获取数据。

但是,您可以更新视图中引用的那些表的基础数据,即通过视图修改数据

您必须以与您相同的方式创建视图,但不包含该UPDATE子句:

SELECT
...
FROM your tables
..

然后UPDATE你的看法。就像是:

UPDATE YourViewName
SET arenda = CASE WHEN PlotArea IS NULL THEN 'no'
                    ELSE 'yes' 
             END;

请注意,此方法受到CREATE VIEW文档中可更新视图部分中定义的限制和限制的限制。


更新

如果您想动态执行此操作,则必须使用触发器,就像您在评论中所做的那样:

CREATE TRIGGER Arenda_update 
ON nbAchizitii
for update AS 
BEGIN 
  UPDATE ac 
  SET Arenda = CASE 
                  WHEN ac.PlotArea IS NULL then 'no'
                else 'Yes' END
  FROM nbAchizitii ac 
  LEFT JOIN nbArenda ar ON ac.PlotArea = ar.PlotArea
end;

SQL 小提琴演示

于 2012-12-12T09:48:26.190 回答