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


                                     觸發器

  觸發器的基礎知識

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之前定義臨時表

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM