局部變量
局部變量必須以@ 開頭,而且必須先用DECLARE 命令說明后才可使用。
使用SELECT 或SET 命令來設定變量的值。
說明形式:
DECLARE @變量名 變量類型 [ @變量名 變量類型]
SELECT @局部變量 = 變量值
SET @局部變量= 變量值
例:
declare @name varchar(20) ? ?--聲明變量
set @name = '奧迪%' ? ?--為變量賦值
declare @avg decimal(18,2)
set @avg=(select AVG(Price) from Car)
print '所有汽車的平均價格是:'+cast(@avg as varchar(20))
IF……ELSE……
IF <條件表達式>
<命令行或程序塊>
[ELSE IF [條件表達式]
<命令行或程序塊>]
BEGIN……END…… ? ?(相當于C#中的大括號{})
BEGIN
<命令行或程序塊>
END
BEGIN…END 用來設定一個程序塊,將在BEGIN…END 內的所有程序視為一個單元執行。BEGIN…END 經常在條件語句如IF…ELSE 中使用。
declare @find varchar(20) ? ?--聲明變量
set @find='寶馬' ? ?--變量賦值
if(@find='寶馬') ? ?--判斷
begin
print '寶馬汽車' ? ?--顯示結果如下第二圖
select * from Car where Name like '%'+(@find)+'%'
end
else
begin
print '其他'
select * from Car
end


?
WAITFOR
WAITFOR 命令用來暫時停止程序執行,直到所設定的等待時間已過或所設定的時間已到才繼續往下執行。
其中時間必須為DATETIME 類型的數據
WAITFOR {DELAY <‘時間’> | TIME <‘時間’>| ERROREXIT | PROCESSEXIT | MIRROREXIT}
DELAY 用來設定等待的時間最多可達24 小時
TIME ? 用來設定等待結束的時間點
ERROREXIT ? ? 直到處理非正常中斷
PROCESSEXIT ? ? ?直到處理正常或非正常中斷
MIRROREXIT ? ?直到鏡像設備失敗
例:
等待1 小時2 分零3 秒后才執行SELECT 語句
waitfor delay ’01:02:03’
select * from employee
等到晚上11 點零8 分后才執行SELECT 語句
waitfor time ’23:08:00’
select * from employee
創建存儲過程
CREATE PROC[EDURE] procedure_name [ ; number ] ? ?--procedure可簡寫為proc,
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]?
AS sql_statement [ ...n ]
例:
create procedure UP_Fruit_Buy ? ?--為方便查看,創建存儲過程名寫為(用戶_表_對表的操作)
@username varchar(50), ? ?--定義形參
@fruitname varchar(50),
@buycount int = 0
as
begin
……
end
?當涉及到修改數據時,用begin tran …… rollback,便于操作失誤時,恢復數據
?
觸發器
觸發器是一種特殊的存儲過程。
觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名字而被直接調用
觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性,另外還有強化約束和級聯運行的功能。
?
inserted,deleted臨時表
這兩個表是由系統管理的,存儲在內存中,不是存儲在數據庫中,因此不允許用戶直接對其修改,是只讀的。
這兩個表的結構總是與被該觸發器作用的表有相同的表結構。
這兩個表是動態駐留在內存中的,當觸發器工作完成,這兩個表也被刪除。
這兩個表主要保存因用戶操作而被影響到的原數據值或新數據值。
?
更新操作包括兩個部分,在deleted中存放了舊值,然后在inserted中存放新值。
插入操作,在inserted中存放新值。
刪除操作,在deleted中存放舊值。
?
種類:after觸發器、instead of觸發器
兩種觸發器的區別:after觸發器是觸發條件執行完以后,才執行觸發器;instead of觸發器是不再執行觸發條件,直接執行觸發器。
?
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{{ { FOR | AFTER | INSTEAD OF }
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ][ NOT FOR REPLICATION ]
AS
sql_statement [ ...n ]
}
例:
create trigger TR_Student_Delete on student ? ?--創建對于表student的觸發器
for delete ? ?--觸發條件
as
…… ? ?--執行過程
go