sqlserver的儲存過程、觸發器、函式
阿新 • • 發佈:2021-12-25
學習sqlserver的儲存過程、觸發器、函式
資料庫儲存結構學習
T-sql的一些語法
declare @arg char(8) 宣告 變數(變數以@開頭) 型別
set @arg='123' 給變數賦值
set @arg=(select ID from user) 給變數賦值
sqlserver的insert、update、delete注意事項
insert:插入一條資料時,會生成一個臨時表inserted
update:更新一條資料時,沒有臨時表updated,有臨時表inserted
delete:刪除一條資料時,會生成一個臨時表deleted
select中的條件語句示例:當性別用1,0表示時,查詢結果中的性別使用【男】【女】顯示
select
case
when sex=1 then '男'
when sex=0 then '女'
end,
max(age),avg(age)
from emp
group by sex
having sex=0
簡單總結【儲存結構】【觸發器】【函式】的作用
1、儲存結構:在資料庫中定義好方法(由sql語句構成),在需要的地方直接 exec 呼叫。優點:sql語句複用,自定義查詢方法邏輯
2、觸發器:當執行【增刪查改】時自動觸發的sql語句
3、函式:執行一些自定義小功能,例如judge(age)函式,返回字串【青年】還是【老年】,類似max、avg函式
儲存過程
儲存過程在【資料庫】下的【可程式設計性】【儲存過程】建立
作用:在資料庫層面建立方法,執行SQL語句,實現自定義高階查詢功能。例如:只寫一條語句,當有引數【學生姓名】時,查單條;當沒有引數【學生姓名】時,查所有。
呼叫:exec 【儲存過程】【引數】
儲存結構基礎語法
-- 目的:呼叫儲存結構,輸入【姓名引數】查詢學生的【ID,學生姓名,年齡】資訊並返回 use library drop PROCEDURE queryAll2 GO CREATE PROCEDURE queryAll2 @name char(8)=NULL-- 新增方法引數並設預設值 -- 新增全域性引數 AS BEGIN SET NOCOUNT ON; if @name is not NULL -- Insert statements for procedure here SELECT ID,學生姓名,年齡 from 學生表 where 學生姓名=@name else SELECT ID,學生姓名,年齡 from 學生表 END GO -- 呼叫儲存結構 exec queryAll2 -- 或者 EXEC queryAll2'ls'
帶輸入輸出引數的儲存結構
-- 目的:呼叫儲存結構,只傳入一個【性別】引數,輸出性別為【男】或【女】學生的【平均年齡】和【最大年齡】
use library
GO -- GO的作用:隔離sql語句,表示事務可以提交
drop PROCEDURE queryAll3
GO
CREATE PROCEDURE queryAll3
@sex char(8), -- 新增方法引數
@AVGage float OUTPUT,
@MAXage float OUTPUT
AS
BEGIN
select @AVGage=AVG(年齡) from 學生表 where 性別=@sex
select @MAXage=MAX(年齡) from 學生表 where 性別=@sex
END
GO
-- 執行使用儲存結構
declare @sex char(8),@out_AVGage float,@out_MAXage float -- 連續宣告三個變數
set @sex='男' -- 給輸入引數賦值
exec queryAll3 @sex,@out_AVGage output,@out_MAXage output -- 執行輸入輸出方法,有output
select @sex as 性別,@out_AVGage as 平均年齡,@out_MAXage as 最大年齡
目的:判斷表、儲存結構、觸發器是否存在,如果存在則刪除
GO
if exists(select * from sysObjects where name='queryAll3')
begin
drop PROCEDURE queryAll3
select'已刪除'
end
GO
SQL日期運算
dateadd 在向指定日期加上天數,返回新的 datetime 值
select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.000
datediff 返回兩個日期天數差值
select datediff(day,'2004-09-01','2004-09-18') --返回:17
觸發器
觸發器在表下面【觸發器】建立
作用:當執行insert、update、delete操作時,觸發事件執行額外操作,例如插入一條資料時,同時生成一條插入歷史記錄
呼叫:自動觸發
執行時間和方式
例如:AFTER insert 在插入資料後執行
instead of delete 替代delete語句,執行delete操作時進入該事件
-- 目的:當有人借書新增記錄時,判斷書是否存在,並自動記錄借書時間和還書時間
SET ANSI_NULLS ON -- select * from table where arg!=NULL查不出結果
GO
-- sql關鍵字允許通過加‘’的形式做變數
-- select 'name' 與 select name 的結果相同,off時,select 'name'顯示不出資料
SET QUOTED_IDENTIFIER ON
GO
if exists(select * from sysObjects where name='borrowbook')
drop TRIGGER borrowbook
Go
CREATE TRIGGER addstudent
ON borrow
AFTER insert
AS
BEGIN
SET NOCOUNT ON; -- 開啟返回影響條數
declare @BID int,@bookID int,@borrowDate date,@returnDate date
set @BID=(select ID from inserted)
set @bookID=(select bookID from inserted)
set @borrowDate=GETDATE()
set @returnDate=dateadd(day,90,@borrowDate)
if exists(select * from book where ID=@bookID)
begin
update borrow set returnDate=@returnDate where ID=@BID
end
else
begin
rollback
print('圖書不存在')
end
END
GO
-- 呼叫
insert into borrow(bookID,name) values(9,'zs') -- 插入借書資料,引數【書名】、【借書人】
使用者自定義函式
作用:自定義類似sum、Max、avg、dateadd的函式
建立:通過【資料庫】【可程式設計性】【函式】【標量值函式】建立
-- 基礎模板
CREATE FUNCTION 函式名 --建立標量函式
[({@形參名 資料型別}[,...n])] --括號內輸入引數
RETURNS 資料型別 --定義返回標量值的資料型別
[WITH 選項]
AS
BEGIN
T-SQL語句 --函式體
RETURN 標量表達式
--返回RETURNS子句中定義的資料型別的單個數據值
END
示例(知識:1、不區分大小寫2、begin end相當於{}隔離語句3、Go開啟事務4、如何刪除【函式】)
-- 目的:呼叫judge(age)函式,返回字串'少年''青年''中年''老年'
if exists(select * from sys.objects where name = 'judge')
drop FUNCTION dbo.judge -- 刪除定義的函式
use library
Go
-- 基礎模板
create FUNCTION dbo.judge(@age int) --建立標量函式
RETURNS nvarchar(50) --定義返回標量值的資料型別
AS
BEGIN
declare @result nvarchar(50)
if @age > 17
set @result='青年'
else if @age > 30
set @result='中年'
else if @age > 60
set @result='老年'
else
set @result='少年'
RETURN @result
END
GO
-- 使用函式
select name,age,sex,dbo.judge(age) from emp