深入DML

來源:互聯網
上載者:User
DML(Data Management Language, 資料管理定義)語句處理資料,可以刪除資料,插入資料,增加資料。列出資料。
INSERT:
有四種基本的格式,先是一種最簡單的格式:
INSERT INTO #famousjaycees VALUES('Julius')
DEFAULT和NULL
為了在有預設值約束的列中插入一個被賦有預設值對象的預設值,其中預設對象允許為NULL。那麼使用關鍵字DEFAULT來代替實際值。使用關鍵字NULL,可以為一個允許為NULL的列準確地指定為NULL值,如果為一個不許為NULL的列指定為NULL(或者為一個沒有預設值的NOT NULL的列指定為DEFAULT)那麼INSERT將失敗。
命令的第二種格式允許同時為所有列指定哪個預設值。
INSERT INTO targetable DEFAULT VALUES
命令的第三種格式可以檢索出用SELECT語句查表出的值。
INSERT #famousjaycees2
SELECT * FROM #famousjaycess
INSERT命令第四種格式允許結果集由預存程序或嵌在表中的SELECT語句來返回。
INSERT #Sp_Who EXEC SP_WHO
INSERT和錯誤:
INSERT命令的一個有趣的特性就是批命令錯誤的密封性。由於約束或無效的複製值而引起的INSERT失敗不會引起批命令失敗。
如果希望有一個INSERT失敗時整個批命令失敗,那麼就在每個INSERT之後檢查自動變數@@ERROR並做出相應的反應。例如:
INSERT #famousjaycees VALUES ('Julis')
IF (@@ERROR <> 0)
GOTO LIST
用INSERT命令來重複資料刪除行
還有一個相關的事項,也是INSERT命令的另一個有趣方面,它可以通過IGNORE_DUP_KEY設定惟一索引的辦法來重複資料刪除行。如果在表中插入一系列的以IGNORE_DUP_KEY為索引的行,那麼破壞索引的惟一約束的行將被拒絕,但是其他行會失敗,為了刪除表中的中複行,可以建立一個結構上與原表相同的工作表,然後再第二個表上建立IGNORE_DUP_KEY索引,其中包括第一個表中所有的候選關鍵字,然後將其插入到第一個表中。
成批插入:
除了標準的INSERT之外,T-SQL還提供了BULK INSERT命令來進行大量資料的載入。
例如:
BULK INSERT famousjaycees FROM 'D:\GG_TS\famousjaycees.bcp'
成批插入和觸發器:
當使用BULK INSERT命令插入進行時,INSERT觸發器不會被觸發。
成批插入和約束:
說明約束可通過使用BULK INSERT的CHECK_CONSTRAINTS選項來執行。預設情況下,除了UNIQUE約束之外,目標表的其他約束都將被忽略,所以如果想在大量資料操作的同時堅持這約束,那麼就要包括這個選項。注意,這樣會大幅度地降低操作速度。
成批插入和同一性列
BULK INSERT的另一個突出的特點是,在預設情況下,載入資料時,將重新產生同一性列的值。很顯然,如果將資料載入到一個有外部關鍵字引用的表中,那麼後果是不堪想象的。為了防止這種情況,需要包括BULK INSERT 的關鍵詞KEEPIDEBTITY。
UPDATE:
UPDATE有兩種基本格式,一種是用靜態來修改表,另一種是用其他表中的資料來修改表。
第一種格式:
UPDATE #famousjaycees
SET jc = 'Johnny'
WHERE jc = 'Joh'
第二種格式:
UPDATE f
SET jc = s.jc
FROM #famousjaycees f
JOIN #semifamousjaycees s ON (f.becamefamous = s.becamefamous)
SQL Server的觸發器每個語句被觸發一次,而不是每行被觸發一次,並且觸發器只有在資料修改之前或之後能夠進行存取。而不是在資料修改過程中的中間時期進行存取,觸發器的代碼不會和觸發他們的INSERT,UPDATE,DELETE命令一起編譯進執行計畫,而是獨立地編譯並放入緩衝區,所以無論觸發它的命令是什麼,都可以有效地重複使用。DML語句的執行計畫分支給它激發的所有觸發器,這種操作時在執行計畫結束之前進行的,如果是結束之後就無法完成了。
這種情況並不適用於約束,每個表的約束都是直接加入DML的執行計畫中。
用UPDATE檢測約束:
如果使用BULK INSERT或其他大批量的載入工具來對有INSERT觸發器的表進行追加資料,那麼你會發現觸發器不能被觸發,在載入資料結束之後,馬上再對錶進行一個假的UPDATE操作。這個假的修改操作只是簡單地將列值置為其本身的值。這樣就會觸發觸發器並對約束進行檢查。如果其中有包含錯誤資料的行,那麼
UPDATE失敗。例如:
BULK INSERT famousjaycees FROM 'D:\GG_TS\famousjaycees.bcp'
SELECT *  FROM famousjaycees
UPDATE famousjaycees
SET jc= jc
限制受UPDATE命令的TOP n的選項,可以限制受UPDATE影響的行數的數目。SELECT語句作為匯出表嵌入在UPDATE的FROM子句中,並與目標表進行串連,例如:
SELECT TOP 10 au_lanme, au_fname, contract FROM authors ORDER BY au_id
UPDATE a
SET a.contract = 0
FROM authors a join (SELECT TOP 5 au_id FROM authors ORDER BY au_id) u ON (a.au_id = u.au_id)
用UPDATE交換列值:
因為UPDATE語句引用的列值通常在操作之前,就已經得到了本身的值了,所以交換值時並不需要中間變數,這樣就可以簡單地得將一列賦給其他列了,如下:
UPDATE #sample SET samp1 = samp2, samp2 = samp1
UPDATE和遊標:
可用UPDATE命令來修改那些由可修改遊標返回的行,這種可能是通過UPDATE的WHERE CURRENT OF語句來實現的.例如:
DECLARE jcs Cursor DYNAMIC FOR SELECT * FROM #famousjaycees FOR UPDATE
OPEN jcs
FETCH RELATIVE 3 FROM jcs
UPDATE  #famousjaycees
SET jc = 'johnny'
WHERE CURRENT OF jcs
CLOSE jcs
DEALLOCATe jcs
DELETE:
DELETE命令似乎是與INSERT相對的,DELETE除了可以通過WHERE 子句中使用約束和變數來限制被刪除的行之外,還可以引用其他表。下面例子中的DELETE語句就是基於與其他表的串連的。例子刪除了Northwind Customers表中的在Order表中沒有訂單的客戶:
DELETE c
FROM Customer c LEFT OUTER JOIN order o ON (c.CustomerID = o.CustomerID)
WHER o.OrderID IS NULL
與UPDATE命令一樣,受DELETE影響行數可以通過SELECT TOP n來限制。
例如:
DELETE s
FROM sales s JOIN (SELECT TOP 5 ord_num FROM sales ORDER BY ord_num) a ON (s.ord_num = a.ord_num)
DELETE和遊標:
使用DELETE命令可以刪除由可修改遊標返回的行。與UPDATE相似,這個功能是通過WHERE CURRENT OF子句來實現。
DECLARE jcs Cursor DYNAMIC FOR SELECT * FROM #famousjaycees
FOR UPDATE
OPEN jcs
FETCH RELATIVE 3 FROM jcs
DELETE #famousjaycees WHERE CURRENT OF jcs
CLOSE jcs
DEALLOCATE jcs
檢測DML錯誤:
通常可以通過檢查自動變數@@ERROR來檢測DML運行時的錯誤。然而,如果DML語句對任何行都沒有影響,那麼@@ERROR將沒有值,因為技術上並不存在錯誤條件,所以就必須檢查@@ROWCOUNT

以上內容是《Transact-SQL權威指南》一書的讀書筆記,感謝作者KEN HENDERSON 和 譯者 健蓮科技 中國電力出版社 為我帶來這麼經典的T-SQL書籍。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.