SQL知識整理一:觸發器、存儲過程、變量表、臨時表

<pre name="code" class="javascript">$('#dd2').draggable({
    proxy:'clone'
});



一、觸發器

create trigger tr_name 
on table/view 
{for | after | instead of } [update][,][insert][,][delete] 
[with encryption] 
as {batch | if update (col_name) [{and|or} update (col_name)] } 

說明: 

  1 tr_name :觸發器名稱 
  2 on table/view :觸發器所作用的表。一個觸發器只能作用於一個表 
  3 for 和after :同義 
  4 after 與instead of :sql 2000新增項目afrer 與 instead of 的區別 
    After 
      在觸發事件發生以後才被激活,只可以建立在表上
    Instead of 
      代替了相應的觸發事件而被執行,既可以建立在表上也可以建立在視圖上
  5 insert、update、delete:激活觸發器的三種操作,可以同時執行,也可選其一
  6 if update (col_name):表明所作的操作對指定列是否有影響,有影響,則激活觸發器。此外,因爲delete 操作只對行有影響
所以如果使用delete操作就不能用這條語句了(雖然使用也不出錯,但是不能激活觸發器,沒意義)。 
  7觸發器執行時用到的兩個特殊表:deleted ,inserted 
    deleted 和inserted 可以說是一種特殊的臨時表,是在進行激活觸發器時由系統自動生成的,其結構與觸發器作用的表結構是一樣的,只是存放 的數據有差異。
    8 說明deleted 與inserted 數據的差異 
    deleted 與inserted 數據的差異 
    Inserted 存放進行insert和update 操作後的數據 
    Deleted 存放進行delete 和update操作前的數據 

    注意:update 操作相當於先進行delete 再進行insert ,所以在進行update操作時,修改前的數據拷貝一條到deleted 表中,修改後的數據在存到觸發器作用的表的同時,也同時生成一條拷貝到insered表中。

觸發器典型示例

if exists(select name from sysobjects where xtype='tr' and name='tri_updateStudent')
begin
    drop trigger tri_UpdateStudent
end
go
create trigger tri_UpdateStudent
    on dbo.student
    for update
as
    if update(Sage)
    begin
       update student set sage=s.sage+d.sage from student s,deleted d where s.studentid=d.studentid
    end
go


二、存儲過程


 存儲過程的優點

    A、 存儲過程允許標準組件式編程

    B、 存儲過程能夠實現較快的執行速度

    C、 存儲過程減輕網絡流量

    D、 存儲過程可被作爲一種安全機制來充分利用

  存儲過程的實例

if exists(select * from sysobjects where xtype='p' and name='proc_Student')


begin 


    drop proc proc_student


end


go


create proc proc_Student


    @name varchar(255),


    @age varchar(255)


as


    begin tran


    select * from student where  sname=@name and sage=@age


    if @@ERROR<>0


       begin


           rollback tran


           insert into student(studentid,sname,sage) values (1,@name,@age)


           return 0


       end


    else


        begin


       commit tran


       select * from student


       end


go


exec proc_student '科比',1;



 三、表變量

  表變量定義:

  表變量創建的語法類似於臨時表,區別就在於創建的時候,必須要爲之命名。表變量是變量的一種,表變量也分爲本地及全局的兩種,本地表變量的名稱都是以“@”爲前綴,只有在本地當前的用戶連接中纔可以訪問。全局的表變量的名稱都是以“@@”爲前綴,一般都是系統的全局變量,像我們常用到的,如@@Error代表錯誤的號,@@RowCount代表影響的行數。


DECLARE @News table 

  ( 

  News_id int NOT NULL, 

  NewsTitle varchar(100), 

  NewsContent varchar(2000), 

  NewsDateTime datetime 

  ) 

  INSERT INTO @News (News_id, NewsTitle, NewsContent, NewsDateTime) 

  VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE()) 

  SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM @News

四、臨時表

  臨時表定義:

  臨時表與永久表相似,只是它的創建是在Tempdb中,它只有在一個數據庫連接結束後或者由SQL命令DROP掉,纔會消失,否則就會一直存在。臨時表在創建的時候都會產生SQL Server的系統日誌,雖它們在Tempdb中體現,是分配在內存中的,它們也支持物理的磁盤,但用戶在指定的磁盤裏看不到文件。

  臨時表分爲本地和全局兩種,本地臨時表的名稱都是以“#”爲前綴,只有在本地當前的用戶連接中才是可見的,當用戶從實例斷開連接時被刪除。全局臨時表的名稱都是以“##”爲前綴,創建後對任何用戶都是可見的,當所有引用該表的用戶斷開連接時被刪除。

CREATE TABLE dbo.#News 
  ( 
  News_id int NOT NULL, 
  NewsTitle varchar(100), 
  NewsContent varchar(2000), 
  NewsDateTime datetime 
  ) 
  INSERT INTO dbo.#News (News_id, NewsTitle, NewsContent, NewsDateTime) 
  VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE()) 
  SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM dbo.#News 
  DROP TABLE dbo.[#News]

 表變量和臨時表對比總結

特性

表變量

臨時表

作用域

當前批處理

當前會話,嵌套存儲過程,全局:所有會話

使用場景

自定義函數,存儲過程,批處理

自定義函數,存儲過程,批處理

創建方式

DECLARE statement only.只能通過DECLEARE語句創建

CREATE TABLE 語句

SELECT INTO 語句.

表名長度

最多128字節

最多116字節

列類型

可以使用自定義數據類型

可以使用XML集合

自定義數據類型和XML集合必須在TempDb內定義

Collation

字符串排序規則繼承自當前數據庫

字符串排序規則繼承自TempDb數據庫

索引

索引必須在表定義時建立

索引可以在表創建後建立

約束

PRIMARY KEY, UNIQUE, NULL, CHECK約束可以使用,但必須在表建立時聲明

PRIMARY KEY, UNIQUE, NULL, CHECK. 約束可以使用,可以在任何時後添加,但不能有外鍵約束

表建立後使用DDL (索引,列)

不允許

允許.

數據插入方式

INSERT 語句 (SQL 2000: 不能使用INSERT/EXEC).

INSERT 語句, 包括 INSERT/EXEC.

SELECT INTO 語句.

Insert explicit values into identity   columns (SET IDENTITY_INSERT).

不支持SET IDENTITY_INSERT語句

支持SET IDENTITY_INSERT語句

Truncate table

不允許

允許

析構方式

批處理結束後自動析構

顯式調用 DROP TABLE 語句. 
  當前會話結束自動析構 (全局臨時表: 還包括當其它會話語句不在引用表.)

事務

只會在更新表的時候有事務,持續時間比臨時表短

正常的事務長度,比表變量長

存儲過程重編譯

會導致重編譯

回滾

不會被回滾影響

會被回滾影響

統計數據

不創建統計數據,所以所有的估計行數都爲1,所以生成執行計劃會不精準

創建統計數據,通過實際的行數生成執行計劃。

作爲參數傳入存儲過程

僅僅在SQL Server2008, 並且必須預定義   user-defined table type.

不允許

顯式命名對象 (索引, 約束).

不允許

允許,但是要注意多用戶的問題

動態SQL

必須在動態SQL中定義表變量

可以在調用動態SQL之前定義臨時表

   用法:無表關聯操作,只作爲中間集進行數據處理,建議用表變量;有表關聯,且不能確定數據量大小的情況下,建議用臨時表。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章