1. 程式人生 > >SQL SERVER-10-觸發器|遊標|動態sql

SQL SERVER-10-觸發器|遊標|動態sql

1.觸發器 --可以理解為一個特殊的儲存過程,在某一個動作執行的時候,自動執行,而不需要人手動執行

--觸發器的分類 --1.DML觸發器 --insert,delete,update(不支援select) --after觸發器,instead of 觸發器(相當於其他資料庫的before觸發器,是一個替代),(不支援before觸發器)

--2.DDL觸發器 --create table,create database,alter,drop

--兩張特殊的表,inserted表和deleted表 --可以把這兩張表看做臨時表 --inserted表,insert和update觸發器會用到 --deleted表,delete和update觸發器會用到

--在insert的時候,先在資料表和inserted表中都插入資料,在提交之後,資料表資料儲存,inserted表中資料銷燬 --在delete的時候,先把資料表中要刪除的資料移動到deleted表中,然後刪除資料表表中資訊,提交之後銷燬deleted表中的資料 --在update的時候,先把資料表中要修改的資料放到deleted表中,然後刪除原資料,再把新的資料儲存到inserted表中和資料表中,提交之後銷燬inserted和deleted表中資料

--sql server沒有行級觸發器,只有表級觸發器 --如果一條sql語句刪除了多行記錄,只會觸發一次觸發器

--操作,建立觸發器在刪除資料的時候對刪除資料進行備份 select * from TblPerson --為TblPerson表編寫一個觸發器,當刪除該表中的記錄的時候,把刪除的記錄備份到一個備份表中 --TblPersonBakTable

--1.先建立一個沒有資料的用來備份的表 select top 0 * into TblPersonBakTable from TblPerson --建立備份表之後查詢一下看看是否成功和是否有資料 select * from TblPersonBakTable

--2.建立刪除觸發器 create trigger tri_delete_TblPerson on TblPerson for delete  --型別為刪除觸發器,這裡的for也可以換成after,他們都表示after觸發器 as begin     --把已經刪除的記錄備份到另一個表中     --1.如何獲得那些已經刪除的資料??     --select * from deleted          --2.把這些已經刪除的資料備份到一個新表中     insert into TblPersonBakTable     select uname,uage,uheight from deleted               --1.開啟事務之後,執行刪除語句,把需要刪除的資料儲存到inserted表中     --2.刪除資料表中的資料     --3.觸發器執行     --4.提交commit     --如果這裡執行roolback,則刪除的事務會被回滾,刪除不再繼續     --roolback end

--如果想要一個觸發器在執行增刪改的時候都觸發,只需要在for後面跟上需要執行的操作即可 --create trigger tri_delete_TblPerson on TblPerson --for delete,insert,update   --執行增,刪,改都會觸發該觸發器 --as --begin --    --把已經刪除的記錄備份到另一個表中 --    --1.如何獲得那些已經刪除的資料?? --    --select * from deleted      --    --2.把這些已經刪除的資料備份到一個新表中 --    insert into TblPersonBakTable --    select uname,uage,uheight from deleted --end

--刪除觸發器 --drop trigger tri_delete_TblPerson

2.遊標 --遊標的效能很低,所以一般情況下不要用遊標

select * from NIS_ADDINS

--1.建立遊標 --fast_forward,是向前的只讀遊標,只能前進不能倒退,所以是遊標中最快的 --scroll,表示可以隨意移動的遊標,能前進也能後退 declare cs_addins cursor fast_forward for --查詢需要操作的資料  select ID,ZYMC FROM NIS_ADDINS  

--定義兩個變數用來接收迴圈的資訊 declare @id varchar(64) ,@zymc varchar(64)

--2.開啟遊標 open cs_addins

--3.操作遊標 --向後移動一條,為變數賦值初始值 fetch next from cs_addins into @id,@zymc --判斷移動是否成功 while @@FETCH_STATUS=0 begin          print @id+'/'[email protected]          --操作下一條資料     fetch next from cs_addins into @id,@zymc end

--4.關閉遊標 close cs_addins

--5.釋放資源 deallocate cs_addins

3.動態sql --儲存過程動態拼接需要執行的sql語句 --比如想要分頁查詢,這裡可以傳入表名稱,實現一個儲存過程就能實現所有的表的分頁查詢 create proc usp_testpp @tbName varchar(50) as begin     declare @sql nvarchar(500)     set @sql='select * from '[email protected]     exec(@sql)     --exec sp_executesql() end --執行儲存過程 exec usp_testpp 'TblStudent'