透過檢視修改資料
您可以透過檢視來修改基礎基底資料表的資料,跟您利用 UPDATE、INSERT 及 DELETE 陳述式,或使用 bcp 公用程式及 BULK INSERT 陳述式來修改資料表中資料的方式相同。但是,下列限制適用於更新檢視,但不適用於資料表:
[!附註]
下列限制中,有一些不適用於資料分割檢視,此外沒有任何一項限制適用於透過 INSTEAD OF 觸發程序套用的更新。如需詳細資訊,請參閱本主題稍後的「透過檢視修改資料的其他選項」。
包括 UPDATE、INSERT 和 DELETE 陳述式在內的任何修改都只能參考一份基底資料表的資料行。
檢視中要修改的資料行必須直接參考資料表資料行中的基礎資料。不能以任何其他方式衍生,例如透過:
彙總函數 (AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 及 VARP)。
計算;不能使用運算式從其他資料行計算得出此資料行。使用集合運算子 (UNION、UNION ALL、CROSSJOIN、EXCEPT 及 INTERSECT) 構成的資料行也會得出計算的結果,因此也不可更新。
要修改的資料行不能受到 GROUP BY、HAVING 或 DISTINCT 子句的影響。
若同時指定 WITH CHECK OPTION,則無法在該檢視的 select_statement 中任何地方使用 TOP。
先前的限制適用於檢視之 FROM 子句中的任何子查詢,正如同它們適用於檢視本身一樣。一般來說,SQL Server 2008 必須能夠從檢視定義,明確地追蹤到某個基底資料表的修改。例如,下列檢視無法更新:
CREATE VIEW TotalSalesContacts
AS
SELECT C.LastName,
SUM(O.TotalDue) AS TotalSales
FROM Sales.SalesOrderHeader O, Person.Contact C
WHERE C.ContactID = O.ContactID
GROUP BY LastName
將無法接受對 TotalSalesContacts 的 LastName 資料行所做的修改,因為 GROUP BY 子句已影響到此資料行。如果相同的姓氏有多個執行個體,SQL Server 就無法知道要針對哪一個進行更新、插入或刪除。同樣地,改為嘗試修改 TotalSalesContacts 的 TotalSales 資料行也會傳回錯誤,因為它是衍生自彙總函數的資料行。SQL Server 無法從該資料行直接追蹤到其基底資料表 SalesOrderHeader。
下列額外的指導方針亦適用:
如果檢視的定義中使用 WITH CHECK OPTION 子句,那麼對檢視所執行的任何資料修改陳述式都必須遵守定義檢視的 SELECT 陳述式中所設的條件。如果使用 WITH CHECK OPTION 子句,就無法修改資料列讓它從檢視中消失。修改的結果若可能造成這種現象,就會被取消,並顯示錯誤訊息。
對於基礎資料表中不允許 Null 值且沒有 DEFAULT 定義的任何資料行,INSERT 陳述式必須為它們指定值。
基礎資料表中所有被修改的資料行資料都必須遵守這些資料行的限制,如是否允許空值、條件約束、DEFAULT 定義等。例如,若要刪除一個資料列,就必須滿足相關資料表中 FOREIGN KEY 的基礎條件約束,這樣刪除才會成功。
不可以使用索引鍵集衍生資料指標來更新分散式資料分割檢視 (遠端檢視)。但只要在基礎資料表上宣告資料指標,而不要在檢視本身宣告,就可以解除這項限制。
下列項目不支援將資料大量匯入資料分割檢視中:bcp、BULK INSERT 和 INSERT ...SELECT * FROM OPENROWSET(BULK...)陳述式。不過,您可以使用 INSERT 陳述式,將多個資料列插入資料分割檢視中。如需詳細資訊,請參閱<從檢視大量匯出資料或將資料大量匯入檢視>。
READTEXT 及 WRITETEXT 陳述式無法與檢視中的 text、ntext 或 image 資料行搭配使用。
透過檢視修改資料的其他選項
如果這個主題先前描述的限制使您無法直接利用檢視來修改資料,請考量下列選項:
使用 INSTEAD OF 觸發程序,配合支援 INSERT、UPDATE 與 DELETE 陳述式的邏輯。如需詳細資訊,請參閱<設計 INSTEAD OF 觸發程序>。
使用會修改一或多個成員資料表的可更新資料分割檢視。如需詳細資訊,請參閱<建立資料分割檢視>。
若要透過檢視新增資料
若要透過檢視變更資料
若要透過檢視刪除資料