當前位置:首頁 » 編程語言 » sql視圖插入行
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql視圖插入行

發布時間: 2022-08-18 07:34:35

sql插入的操作

使用 inserted 和 deleted 表

觸發器語句中使用了兩種特殊的表:deleted 表和 inserted 表。Microsoft® SQL Server™ 2000 自動創建和管理這些表。可以使用這兩個臨時的駐留內存的表測試某些數據修改的效果及設置觸發器操作的條件;然而,不能直接對表中的數據進行更改。

inserted 和 deleted 表主要用於觸發器中:

擴展表間引用完整性。

在以視圖為基礎的基表中插入或更新數據。

檢查錯誤並基於錯誤採取行動。

找到數據修改前後表狀態的差異,並基於此差異採取行動。
Deleted 表用於存儲 DELETE 和 UPDATE 語句所影響的行的復本。在執行 DELETE 或 UPDATE 語句時,行從觸發器表中刪除,並傳輸到 deleted 表中。Deleted 表和觸發器表通常沒有相同的行。

Inserted 表用於存儲 INSERT 和 UPDATE 語句所影響的行的副本。在一個插入或更新事務處理中,新建行被同時添加到 inserted 表和觸發器表中。Inserted 表中的行是觸發器表中新行的副本。

更新事務類似於在刪除之後執行插入;首先舊行被復制到 deleted 表中,然後新行被復制到觸發器表和 inserted 表中。

在設置觸發器條件時,應當為引發觸發器的操作恰當使用 inserted 和 deleted 表。雖然在測試 INSERT 時引用 deleted 表或在測試 DELETE 時引用 inserted 表不會引起任何錯誤,但是在這種情形下這些觸發器測試表中不會包含任何行。

說明 如果觸發器操作取決於一個數據修改所影響的行數,應該為多行數據修改(基於 SELECT 語句的 INSERT、DELETE 或 UPDATE)使用測試(如檢查 @@ROWCOUNT),然後採取相應的對策。

SQL Server™ 2000 不允許 AFTER 觸發器引用 inserted 和 deleted 表中的 text、ntext 或 image 列;然而,允許 INSTEAD OF 觸發器引用這些列。有關更多信息,請參見 CREATE TRIGGER。

在 INSTEAD OF 觸發器中使用 inserted 和 deleted 表

傳遞到在表上定義的 INSTEAD OF 觸發器的 inserted 和 deleted 表遵從與傳遞到 AFTER 觸發器的 inserted 和 deleted 表相同的規則。inserted 和 deleted 表的格式與在其上定義 INSTEAD OF 觸發器的表的格式相同。inserted 和 deleted 表中的每一列都直接映射到基表中的列。

有關引用帶 INSTEAD OF 觸發器的表的 INSERT 或 UPDATE 語句何時必須提供列值的規則與表沒有 INSTEAD OF 觸發器時相同:
不能為計算列或具有 timestamp 數據類型的列指定值。
不能為具有 IDENTITY 屬性的列指定值,除非該列的 IDENTITY_INSERT 為 ON。當 IDENTITY_INSERT 為 ON 時,INSERT 語句必須提供一個值。
INSERT 語句必須為所有無 DEFAULT 約束的 NOT NULL 列提供值。

對於除計算列、標識列或 timestamp 列以外的任何列,任何允許空值的列或具有 DEFAULT 定義的 NOT NULL 列的值都是可選的。
當 INSERT、UPDATE 或 DELETE 語句引用具有 INSTEAD OF 觸發器的視圖時,資料庫引擎將調用該觸發器,而不是對任何錶採取任何直接操作。即使為視圖生成的 inserted 和 deleted 表中的信息格式與基表中的數據格式不同,該觸發器在生成執行基表中的請求操作所需的任何語句時,仍必須使用 inserted 和 deleted 表中的信息。

傳遞到在視圖上定義的 INSTEAD OF 觸發器的 inserted 和 deleted 表格式與為該視圖定義的 SELECT 語句的選擇列表相匹配。例如:

CREATE VIEW EmployeeNames (EmployeeID, LName, FName)
AS
SELECT EmployeeID, LastName, FirstName
FROM Northwind.dbo.Employees

視圖的結果集有三列:一個 int 列和兩個 nvarchar 列。傳遞到在視圖上定義的 INSTEAD OF 觸發器的 inserted 和 deleted 表也具有名為 EmployeeID 的 int 列、名為 LName 的 nvarchar 列和名為 FName 的 nvarchar 列。

視圖的選擇列表還包含不直接映射到單個基表列的表達式。一些視圖表達式(如常量調用或函數調用)可能不引用任何列,這類表達式會被忽略。復雜的表達式會引用多列,但在 inserted 和 deleted 表中,每個插入的行僅有一個值。如果視圖中的簡單表達式引用具有復雜表達式的計算列,則這些簡單表達式也有同樣的問題。視圖上的 INSTEAD OF 觸發器必須處理這些類型的表達式。

Ⅱ SQL Server向視圖中插入數據應該注意些什麼

創建視圖應注意以下幾點:
1、只能在當前資料庫中創建視圖。
2、一個視圖最多可以應用1024列。
3、視圖的命名必須符合SQL
Server中的標識符的定義規則。
4、可以將視圖建立在其他試圖或應用上。
5、不能將規則、默認值綁定在視圖上。
6、定義視圖的查詢語句中不能包括ORDER
BY
COMPUTE
COMPUTE
BY子句或INTO等關鍵字。
7、在默認的情況下,視圖的列名繼承了它們基表中的名稱。

Ⅲ 如何在sql server資料庫的視圖上插入新的數據

視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在資料庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。
當建立視圖時使用的表中的數據發生了改變後,視圖中的數據也會發生相應的改變,視圖本身是不能執行添加,刪除,修改的!
如果要插入新數據的話,建議使用觸發器,在視圖相對應的各表中插入數據。視圖中自然更新。

Ⅳ sql視圖插入數據

如果視圖僅包含2列,那麼語法沒有錯誤。
出錯的原因可能是視圖是基表所有列中的一部分而基表中其它列不允許為空,或者基表是多個表join,多個表作為基表的視圖不能進行insert。

如果視圖的列多於2列,你的語法就是錯誤的,必須在表名後指定列名。

INSERT INTO V_SALERS(列1,列2)
VALUES('S6','聯想集團')

Ⅳ T-SQL語句中如何使用INSERT語句插入多行數據

SQLSERVER裡面可以採用下面兩種辦法。 使用SELECT INTO 插入行 SELECT INTO 語句創建一個新表,並用 SELECT 的結果集填充該表。新表的結構由選擇列表中表達式的特性定義,例如: SELECT Shippers.*, Link.Address, Link.City, Link.Region, Link.PostalCode INTO NewShippers FROM Shippers JOIN LinkServer.DB.dbo.Shippers AS Link ON (Shippers.ShipperID = Link.ShipperID) SELECT INTO 可將幾個表或視圖中的數據組合成一個表。也可用於創建一個包含選自鏈接伺服器的數據的新表。 使用INSERT...SELECT 插入行 INSERT 語句中的 SELECT 子查詢可用於將一個或多個其它的表或視圖的值添加到表中。使用 SELECT 子查詢可同時插入多行。 下面的 INSERT 語句將 titles 中數據的 type 是 modern cooking 的所有行的數據插入到一個單獨的表中:USE pubsINSERT INTO MyBooks SELECT title_id, title, type FROM titles WHERE type = 'mod_cook' 子查詢的選擇列表必須與 INSERT 語句列的列表匹配。如果沒有指定列的列表,選擇列表必須與正向其插入的表或視圖的列匹配。

Ⅵ sql 視圖裡面插入一條數據 條件按Id

你的id是不是自動增長的,如果不是的話,id的值也要插入的,還有一種可能就是他跟其他的表有主外鍵的關系也是不能插入的!

Ⅶ 簡述SQL中對視圖進行插入操作,必須具備的條件

視圖必須來源於一個表,
一般行子集視圖都沒問題(行子集視圖就是視圖數據只是過濾了基表的某些行)
如果是列子集視圖,那麼視圖中應該包括基本的關鍵列,例如主鍵, NOT NULL的列等

如果是多表視圖,或列子集視圖(不滿足我上面寫的條件的), 你可以用INSTEAD OF INSERT觸發器來實現

Ⅷ sql視圖中如何插入新的數據

對於 單表的視圖, 插入/修改 數據是沒有問題的。 (只要你不做特別的設置)

對於多表的視圖, 操作的時候,會存在一定的問題。

下面是一個例子:

1> CREATE VIEW v_main_sub AS
2> SELECT
3> test_main.id AS main_id,
4> test_main.value AS main_value,
5> test_sub.id AS sub_id,
6> test_sub.value AS sub_value
7> FROM
8> test_main, test_sub
9> WHERE
10> test_main.id = test_sub.main_id;
11> go

1> SELECT * FROM v_main_sub;
2> go
main_id main_value sub_id sub_value
----------- ---------- ----------- ----------
1 ONE 1 ONEONE
2 TWO 2 TWOTWO

(2 行受影響)

1> UPDATE v_main_sub
2> SET main_value='ONX'
3> WHERE main_id = 1;
4> go

(1 行受影響)

1> UPDATE v_main_sub
2> SET sub_value='ONXONX'
3> WHERE main_id = 1;
4> go

(1 行受影響)

1> DELETE FROM v_main_sub WHERE main_id = 1;
2> go
消息 4405,級別 16,狀態 1,伺服器 GMJ-PC\SQLEXPRESS,第 1 行
視圖或函數 'v_main_sub' 不可更新,因為修改會影響多個基表。

-- 這個觸發器, 只測試輸出, 不刪除數據。
1> CREATE TRIGGER v_main_sub_trigger
2> ON v_main_sub
3> INSTEAD OF DELETE
4> AS
5> DECLARE
6> @main_id INT,
7> @sub_id INT;
8> BEGIN
9> SELECT @main_id=main_id, @sub_id=sub_id FROM deleted;
10>
11>
12> PRINT(@main_id);
13> PRINT(@sub_id);
14> END;
15> go

1> DELETE FROM v_main_sub WHERE main_id = 1;
2> go
1
1

(1 行受影響)
1> DELETE FROM v_main_sub WHERE sub_id = 1;
2> go
1
1

(1 行受影響)

對於多表關聯的視圖, 刪除的時候,需要人為的去判斷
例如當 主表 和 子表,都只有一條記錄的情況下。
無法判斷 本次刪除, 是要刪除掉一個子表的記錄,留下主表的。
還是 主表 子表的數據,一同刪除。