THE8
系統存儲過程的名稱都以“sp_”開頭或”xp_”開頭
常用節選
系統存儲過程 說明
sp_databases |
列出服務器上的所有數據庫。 |
sp_helpdb |
報告有關指定數據庫或所有數據庫的信息 |
sp_renamedb |
更改數據庫的名稱 |
sp_tables |
返回當前環境下可查詢的對象的列表 |
sp_columns |
回某個表列的信息 |
sp_help |
查看某個表的所有信息 |
sp_helpconstraint |
查看某個表的約束 |
sp_helpindex |
查看某個表的索引 |
sp_stored_procedures |
列出當前環境中的所有存儲過程。 |
sp_password |
添加或修改登錄帳戶的密碼。 |
sp_helptext |
顯示默認值、未加密的存儲過程、用戶定義的存儲過程、觸發器或視圖的實際文本。 |
注:過程由EXEC指定打頭執行
常用的擴展存儲過程:xp_cmdshell
可以執行DOS命令下的一些的操作
以文本行方式返回任何輸出
調用語法:
EXEC xp_cmdshell DOS命令 [NO_OUTPUT]
定義存儲過程的語法
CREATE PROC[EDURE] 存儲過程名
@參數1 數據類型 = 默認值 OUTPUT,
…… ,
@參數n 數據類型 = 默認值 OUTPUT
AS
SQL語句
GO
和C語言的函數一樣,參數可選
參數分爲輸入參數、輸出參數
輸入參數允許有默認值
EXP:
設計1(無默認值 無輸出型)
CREATE PROCEDURE proc_stu
@writtenPass int, --筆試及格線
@labPass int --上機及格線
AS
print '--------------------------------------------------'
print '參加本次考試沒有通過的學員:'
SELECT stuName, stuInfo.stuNo, writtenExam, labExam
FROM stuInfo
INNER JOIN stuMarks ON
stuInfo.stuNo = stuMarks.stuNo
WHERE writtenExam < @writtenPass OR labExam < @labPass
GO
調用
方法1: EXEC proc_stu 60, 55
方法2: EXEC proc_stu @labPass = 55, @writtenPass = 60
設計2(有默認值 有輸出型)
CREATE PROCEDURE proc_stu
@notpassSum int OUTPUT,
@writtenPass int=60,
@labPass int=60
AS
SELECT stuName, stuInfo.stuNo, writtenExam, labExam
FROM stuInfo INNER JOIN stuMarks
ON stuInfo.stuNo = stuMarks.stuNo
WHERE writtenExam < @writtenPass
OR labExam < @labPass
SELECT @notpassSum = COUNT(stuNo)
FROM stuMarks WHERE writtenExam < @writtenPass
OR labExam < @labPass
GO
調用
/*---調用存儲過程----*/
DECLARE @sum int
EXEC proc_stu @sum OUTPUT ,64 --要指定輸出變量名和OUTPUT參數
print '--------------------------------------------------'
IF @sum>=3
print '未通過人數:'+convert(varchar(5),@sum)+ '人, 超過60%,及格分數線還應下調'
ELSE
print '未通過人數:'+convert(varchar(5),@sum)+ '人, 已控制在60%以下,及格分數線適中'
GO
自定義錯誤RAISERROR語句
RAISERROR (msg_id | msg_str, severity, state WITH option [,...n]])
msg_id:在sysmessages系統表中指定用戶定義錯誤信息
msg_str:用戶定義的特定信息,最長255個字符
severity:定義嚴重性級別。用戶可使用的級別爲0–18級
state:表示錯誤的狀態,1至127之間的值
option:指示是否將錯誤記錄到服務器錯誤日誌中
EXP:
設計
CREATE PROCEDURE proc_stu
@notpassSum int OUTPUT, --輸出參數
@writtenPass int=60, --默認參數放後
@labPass int=60 --默認參數放後
AS
IF (NOT @writtenPass BETWEEN 0 AND 100)
OR (NOT @labPass BETWEEN 0 AND 100)
BEGIN
RAISERROR (‘及格線錯誤,請指定0-100之間的分數,統計中斷退出',16,1)
RETURN ---立即返回,退出存儲過程
END
…..其他語句同上例,略
GO
調用
/*---調用存儲過程,測試RAISERROR語句----*/
DECLARE @sum int, @t int
EXEC proc_stu @sum OUTPUT ,604
SET @t=@@ERROR
print '錯誤號:'+convert(varchar(5),@t )
IF @t<>0
RETURN --退出批處理,後續語句不再執行
print '--------------------------------------------------'
IF @sum>=3
print '未通過人數:'+convert(varchar(5),@sum)+ '人,超過60%,及格分數線還應下調'
ELSE
print '未通過人數:'+convert(varchar(5),@sum)+ '人,已控制在60%以下,及格分數線適中'
GO
THE9
ON 表名
FOR INSERT、UPDATE 或 DELETE
AS
...
CREATE TRIGGER Trigger_name
ON Table_name
[with encrypyion] –加密防止複製
FOR {[DELETE INSERT UPDATE]}
AS
SQL語句
Inserted 表
插入命令 更新命令的插入步驟
Deleted 表
刪除命令 更新命令的刪除步驟
Exp:
USE MyDB
GO
IF EXISTS (SELECT name FROM sysobjects WHERE name = ‘trigger_test’)
DROP TRIGGER trigger_test
CREATE TRIGGER trigger_test
ON table_test
FOR update
AS
DECLARE @afterNum, @afterNum
SELECT @beforeNum =currNum FROM deleted
SELECT @ afterNum=currNum FROM inserted
IF ABS(@afterNum - @afterNum) > 1000
BEGIN
RAISERROR(‘該測試數據不可大於1000’)
ROLLBACK TRASACTION
END
觸發器 檢查修改某列