9

次のテーブルがあるとします。

create table t_Item (
    ItemID int not null identity(1,1) constraint PK_Item primary key,
    Description varchar(256) not null,
    Price decimal(10,2) not null
)

および次のビュー:

create view Item as
  select ItemID
        ,Description
        ,Price
        ,1.09 Tax
        ,Price * 1.09 TaxedPrice
    from t_Item

TaxedPriceは派生列でありTax、定数列です。

したがって、それらのいずれも挿入または更新できません。次の最初のクエリは成功しますが、他のクエリはエラーで失敗します。

insert into Item (Description, Price) values ('Test item', 14.00)

insert into Item (Description, Price, TaxedPrice) values ('Test item', 14.00, 15.26)

insert into Item (Description, Price, Tax) values ('Test item', 14.00, 1.09)

そして、返されたエラー メッセージは次のとおりです。

派生フィールドまたは定数フィールドが含まれているため、ビューまたは関数 'アイテム' の更新または挿入に失敗しました。

おそらくシステムビューを使用して、更新してはならないビュー列をリストする方法はありますか?

4

2 に答える 2

2

探している情報を保存するシステム ビューがないようです。ビュー定義を解析するか、例外処理によって、派生列または定数列を見つけることができます...良くありませんが、他の方法は見つかりませんでした...

于 2013-03-06T20:41:30.993 に答える
1
  1. すべての列は、派生列と見なされる次の集計関数から取得されます。AVG、カウント、合計、最小、最大、グループ化、STDEV、STDEVP、VAR、VARP
  2. ビュー定義に次の構文が含まれている場合、すべての列が派生列と見なされます。UNION、UNION ALL、CROSSJOIN、EXCEPT、INTERSECT
  3. GROUP BY、HAVING、DISTINCT の影響を受ける列も派生列と見なされます。

これですべてのシナリオがカバーされるとは思いませんが、パーサーを作成するための出発点です。

于 2013-03-07T19:16:26.270 に答える