1. 程式人生 > >SQL知識整理一:觸發器、儲存過程、變量表、臨時表

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  [email protected] and [email protected]


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

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


相關推薦

SQL知識整理觸發器儲存過程臨時

<pre name="code" class="javascript">$('#dd2').draggable({ proxy:'clone' }); 一、觸發器 create trigger tr_name on table/view {for

Mysql儲存過程2:定義與參數傳遞

變量定義 color ted lec mysq 傳遞 參數傳遞 fault 可選 #儲存過程 中的變量定義 declare 變量名 類型 可選類型 -- 跟建表差不多 create procedure p() begin declare age int de

MySQL檢視觸發器儲存過程事務

檢視: 檢視,虛擬表 建立虛擬表: # 語法: # create view 虛擬表名稱 as 虛擬表; create view course_and_teacher as select * from course inner join teacher on course.teacher_id =

SQL的綜合案例(觸發器函式遊標儲存過程

下面是一個學生資訊的建立 在這裡就不建立資料庫了 CREATE TABLE CLASS ( class_id int IDENTITY PRIMARY KEY, --班級ID class_name Varchar(50), --班級名稱 cla

sql server 查看錶檢視觸發器儲存過程等組成sql查詢語句

1. 檢視使用者表 select name from sys.tables select name from sys.objects where type='U' select name from sysobjects where xtype='U'   其中type

SQL Server基礎(三)SQL Server 的儲存過程什麼是儲存過程儲存過程有什麼作用儲存過程的使用方法

一、簡介 網上百度了好幾篇部落格,都沒有說明儲存過程是什麼東西?然後這個東西有什麼用? 從馬克思認識論上來看,我們必須先認識事物是什麼東西(即本質),然後才進一步認識事物是用來幹嘛的(即屬性)。於是,參考了下面的這篇CSDN論壇,和大家分享下,什麼是儲存過程,它又有什麼用。 htt

SQL函式判斷庫儲存過程等是否存在

----------------- 庫是否存在if exists(select * from master..sysdatabases where name=N'庫名')print 'exists'elseprint 'not exists'----------------- 判斷要建立的表名是否存在if e

第六篇檢視觸發器事務儲存過程函式

一 檢視 檢視是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的資料集,併為其命名】,使用者使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用檢視我們可以把查詢過程中的臨時表摘出來,用檢視去實現,這樣以後再想操作該臨時表的資料時就無需重寫複雜的sql了,直接去檢視中查詢即

ORACLE PL/SQL語法應用遊標,儲存過程觸發器,函式

--遊標 --do while迴圈 declare    cursor c is select * from t_t_student order by id;   v_record c%rowtype

SQL server觸發器儲存過程操作遠端資料庫插入資料,解決伺服器已存在的問題

最近弄了一個小專案,也不是很複雜,需要將一個數據庫的一些資料備份到另外一個庫,不是本地,可能是網路上其他的資料庫,想了一下,用了儲存過程和觸發器。也不是很複雜,首先我需要操作遠端資料庫,於是寫了一個儲存過程: CREATE PROCEDURE sendInfoToRemo

MySQL觸發器儲存過程自定義函式檢視 常用SQL

1.建立一個userinfo表新增記錄時的觸發器 將新增日誌加入到userinfolog 2.建立一個向userinfo表新增記錄的儲存過程 3.根據userinfo表的出生日期欄位 我們將建立一個簡單算得年齡的自定義函式 4.建立一個userinfo的檢視 呼叫年齡函式

前端知識學習 CSS基礎

分隔 color html元素 http 方式 瀏覽器 單位 工作 分離 一.CSS概述     css指的是層疊樣式表,樣式定義如何顯示HTML元素,樣式通常存儲在樣式表中,   把樣式添加到HTML4.0中,是為了解決內容和表現分離的問題。外部樣式表通常存儲在css文件

檢視觸發器事務儲存過程函式,流程控制

檢視 檢視是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的資料集,併為其命名】,使用者使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用檢視我們可以把查詢過程中的臨時表摘出來,用檢視去實現,這樣以後再想操作該臨時表的資料時就無需重寫複雜的sql了,直接去檢視中查詢即可,

二十二儲存過程高效率執行

                        

asp執行sql語句儲存過程的幾種方法

使用connection物件 會返回一個關閉的recordset記錄集,此記錄集不要再次宣告關閉 建議在update、insert、delete時使用 strCon="provider=sqloledb;data source=servername;initial catalog

sql server 刪除所有 檢視儲存過程

--刪除檢視: declare mycur cursor local for select [name] from dbo.sysobjects where xtype='V' --宣告遊標 declare @name varchar(100) OPEN mycur --開啟

mysql-檢視觸發器事務儲存過程函式

目錄 檢視 觸發器 事務 儲存過程 流程控制 一、檢視 檢視是由查詢結果構成的一張虛擬表,和真實的表一樣,帶有名稱的列和行資料 強調:檢視是永久儲存的,但是檢視儲存的不是資料,只是一條sql語句 檢視的特點: 檢視的列可以來自不同的表,是表的抽象和邏輯意義上建立的新關係。 

時序資料庫技術體系()時序資料儲存模型設計

時序資料庫技術體系中一個非常重要的技術點是時序資料模型設計,不同的時序系統有不同的設計模式,而不同的設計模式對時序資料的讀寫效能、資料壓縮效率等各個方面都有非常重要的影響。這篇文章筆者將會分別針對OpenTSDB、Druid、InfluxDB以及Beringei這四個時序系統中的時序資料模型設計進行

IM開發基礎知識補課(四)正確理解HTTP短連線中的CookieSession和Token

1、前言 眾所周之,IM是個典型的快速資料流交換系統,當今主流IM系統(尤其移動端IM)的資料流交換方式都是Http短連線+TCP或UDP長連線來實現。Http短連線主要用於從伺服器讀取各種持久化資訊:比如使用者資訊、聊天曆史記錄、好友列表等等,長連線則是用於實時的聊天訊息

專案整理資料庫設計

裝置管理平臺,支援不同裝置種類的管理,如蒸汽表、燃氣表、水錶等。為了滿足這種需求,資料庫設計時,對裝置資訊相關的表的屬性欄位採用的方式時:設定10個double column,10個int column,10個String column,5個date colum