1. 程式人生 > 其它 >sqlserver的儲存過程、觸發器、函式

sqlserver的儲存過程、觸發器、函式

學習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