1.學習網址
https://www.cnblogs.com/selene/p/4483612.html
2.優缺點
存儲過程的優點:
1.存儲過程加快系統運行速度,存儲過程只在創建時編譯,以後每次執行時不需要重新編譯。
2.存儲過程可以封裝複雜的數據庫操作,簡化操作流程,例如對多個表的更新,刪除等。
3.可實現模塊化的程序設計,存儲過程可以多次調用,提供統一的數據庫訪問接口,改進應用程序的可維護性。
4.存儲過程可以增加代碼的安全性,對於用戶不能直接操作存儲過程中引用的對象,SQL Server可以設定用戶對指定存儲過程的執行權限。
5.存儲過程可以降低網絡流量,存儲過程代碼直接存儲於數據庫中,在客戶端與服務器的通信過程中,不會產生大量的T_SQL代碼流量。
提高速度,降低流量,簡化操作,增加安全性(數據庫可指定用戶權限訪問存儲過程)
存儲過程的缺點:
1.數據庫移植不方便,存儲過程依賴與數據庫管理系統, SQL Server 存儲過程中封裝的操作代碼不能直接移植到其他的數據庫管理系統中。
2.不支持面向對象的設計,無法採用面向對象的方式將邏輯業務進行封裝,甚至形成通用的可支持服務的業務邏輯框架.
3.代碼可讀性差,不易維護。不支持集羣。
依賴數據庫管理系統,移植性差等 我暫時只能瞭解這麼深,抱歉
//
SQL語句寫在數據庫中,用戶寫SQL語句時,只需要寫函數名稱和參數即可。
3.我的使用
申明一個查詢的存儲過程
create proc searchA(
@id varchar(36)
)
as
select *from A where Id = @id
執行調用如下
exec searchA '1';
執行上面調用等於:
select * from A where id = '1' 《==》 exec searchA '1';
申明一個插入的存儲過程
create proc insertA(
@id varchar(36),
@passnum char(20)
)
as
insert into dbo.A(Id,passnum) values(@id,@passnum)
調用如下
exec insertA '21','666';
執行上面調用等於:
insert into dbo.A(Id,passnum) values('21','666') 《==》 exec insertA '21','666'
其他存儲過程類似
如刪除
create proc deleteA(
@id varchar(36)
)
as
delete from A where Id=@id
調用刪除過程
exec deleteA '5';
表名不能爲參數 --下面這樣不行
--create proc deleteAByName(
-- @tname char(20),
-- @id varchar(36)
--)
--as
-- delete from @tname where Id = @id
想要存儲過程 表名也能爲參數 設置,需類似下面這樣
這樣存儲過程不針對哪一張表,不同的表也可以複用
create proc selectFromT(
@tname char(20),
@id varchar(36)
)
as
declare @sqlstr nvarchar(2000)
Begin
set @sqlstr = N'select * from '+@tname+' where Id ='+ @id
Execute sp_executesql @sqlstr
END
上面主要是用到了動態執行sql => Execute sp_executesql sqlstring
上面字符串我在前面加了N,雖然不加也可以
調用如下
exec selectFromT 'A','1';
--可能會有一些錯誤,要找出來自己改掉。