sql資料庫存儲過程
一、簡單的儲存過程:
1、創建一個存儲過程
create procere GetUsers()
begin
select * from user;
end;12345
2、調用存儲過程
call GetUsers();12
3、刪除存儲過程
drop procere if exists GetUsers;
二、帶參數的存儲過程
1、MySql 支持 IN (傳遞給存儲過程) , OUT (從存儲過程傳出) 和 INOUT (對存儲過程傳入和傳出) 類型的參數 , 存儲過程的代碼位於 BEGIN 和 END 語句內 , 它們是一系列 SQL 語句 , 用來檢索值 , 然後保存到相應的變數 (通過指定INTO關鍵字) ;
2、下面的存儲過程接受三個參數 , 分別用於獲取用戶表的最小 , 平均 , 最大分數 , 每個參數必須具有指定的類型 , 這里使用十進制值(decimal(8,2)) , 關鍵字 OUT 指出相應的參數用來從存儲過程傳出
create procere GetScores(
out minScore decimal(8,2),
out avgScore decimal(8,2),
out maxScore decimal(8,2)
)
begin
select min(score) into minScore from user;
select avg(score) into avgScore from user;
select max(score) into maxScore from user;
end;1234567891011
3、調用此存儲過程 , 必須指定3個變數名(所有 MySql 變數都必須以@開始) , 如下所示 :
call GetScores(@minScore, @avgScore, @maxScore);12
4、該調用並沒有任何輸出 , 只是把調用的結果賦給了調用時傳入的變數@minScore, @avgScore, @maxScore, 然後即可調用顯示該變數的值 :
select @minScore, @avgScore, @maxScore;
5、使用 IN 參數 , 輸入一個用戶 id , 返回該用戶的名字 :
create procere GetNameByID(
in userID int,
out userName varchar(200)
)
begin
select name from user
where id = userID
into userName;
end;12345678910
6、調用存儲過程 :
call GetNameByID(1, @userName);
select @userName;123
⑵ SQL 存儲過程建立和使用方法
Sql Server的存儲過程是一個被命名的存儲在伺服器上的Transacation-Sql語句集合,是封裝重復性工作的一種方法,它支持用戶聲明的變數、條件執行和其他強大的編程功能。 存儲過程相對於其他的資料庫訪問方法有以下的優點: (1)重復使用。存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。 (2)提高性能。存儲過程在創建的時候就進行了編譯,將來使用的時候不用再重新編譯。一般的SQL語句每執行一次就需要編譯一次,所以使用存儲過程提高了效率。 (3)減少網路流量。存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。 (4)安全性。參數化的存儲過程可以防止SQL注入式的攻擊,而且可以將Grant、Deny以及Revoke許可權應用於存儲過程。 存儲過程一共分為了三類:用戶定義的存儲過程、擴展存儲過程以及系統存儲過程。 其中,用戶定義的存儲過程又分為Transaction-SQL和CLR兩種類型。 Transaction-SQL 存儲過程是指保存的Transaction-SQL語句集合,可以接受和返回用戶提供的參數。 CLR存儲過程是指對.Net Framework公共語言運行時(CLR)方法的引用,可以接受和返回用戶提供的參數。他們在.Net Framework程序集中是作為類的公共靜態方法實現的。(本文就不作介紹了) 創建存儲過程的語句如下:Code
CREATE { PROC | PROCEDURE } [schema_name.] procere_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ [ OUT [ PUT ]
] [ ,n ]
[ WITH <procere_option> [ ,n ]
[ FOR REPLICATION ]
AS { <sql_statement> [;][ n ] | <method_specifier> }
[;]
<procere_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE_AS_Clause ]
<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }
<method_specifier> ::=
EXTERNAL NAME assembly_name.class_name.method_name [schema_name]: 代表的是存儲過程所屬的架構的名稱 例如: Create Schema yangyang8848
Go
Create Proc yangyang8848.AllGoods
As Select * From Master_Goods
Go 執行:Exec AllGoods 發生錯誤。 執行:Exec yangyang8848.AllGoods 正確執行。 [;Number]: 用於對同名過程進行分組的可選整數。使用一個 DROP PROCEDURE 語句可將這些分組過程一起刪除。 例如: Create Proc S1 ;1
AS
Select * From Master_Goods
Go
Create Proc S1 ;2
As
Select * From Master_Location
Go 創建完畢了兩個存儲過程。它們在同一個組S1里,如果執行Exec S1 則存儲過程默認執行 Exec S1 ;1 。如果我們想得到所有據點信息則需要執行Exec S1 ;2。當我們要刪除存儲過程的時候,只能執行Drop Exec S1 則該組內所有的存儲過程被刪除。 [@ parameter]: 存儲過程中的參數,除非將參數定義的時候有默認值或者將參數設置為等於另一個參數,否則用戶必須在調用存儲過程的時候為參數賦值。 存儲過程最多有2100個參數。 例如: Create Proc yangyang8848.OneGoods
@GoodsCode varchar(10)
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Go 調用的代碼: Declare @Code varchar(10)
Set @Code = '0004'
Exec yangyang8848.OneGoods @Code 在參數的後邊加入Output 表明該參數為輸出參數。 Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) output,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go 調用方法:
Declare @VV2 varchar(10)
Exec yangyang8848.OneGoods @Code out 注意:如果存儲過程的兩個參數一個有默認值一個沒有,那麼我們要把有默認值得放在後邊,不然會出問題哦~~ 細心的朋友,可能看到上邊的語句有一些不同,比如,存儲過程用的是output,而調用語句用的是out。我要告訴您,兩者是一樣的。 [RECOMPILE]:指示資料庫引擎 不緩存該過程的計劃,該過程在運行時編譯。如果指定了 FOR REPLICATION,則不能使用此選項。對於 CLR 存儲過程,不能指定 RECOMPILE。 這個說一個非常好用的函數 OBJECT_ID :返回架構范圍內對象的資料庫對象標識號。 例如:我們創建存儲過程時,可以如下寫代碼 If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go 針對於上邊的這個存儲過程,我們調用以下SQL查詢 Select definition From sys.sql_moles
Where object_id = Object_ID('yangyang8848.OneGoods'); 我們是可以查到結果的。 可是如果我們對該存儲過程加入[ ENCRYPTION ] 那麼你將無法看到任何結果 If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011' With Encryption
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go</SPAN> 然後我們查詢 sys.sql_moles 目錄視圖,將返回給你Null。</p> 然後我們執行以下SQL: Exec sp_helptext 'yangyang8848.OneGoods' 你將得到以下結果:The text for object 'yangyang8848.OneGoods' is encrypted. 說到這里你應該明白了,參數[ ENCRYPTION ]:是一種加密的功能, 將 CREATE PROCEDURE 語句的原始文本轉換為模糊格式。模糊代碼的輸出在 SQL Server 2005 的任何目錄視圖中都不能直接顯示。對系統表或資料庫文件沒有訪問許可權的用戶不能檢索模糊文本。但是,可通過 DAC 埠訪問系統表的特權用戶或直接訪問資料庫文件的特權用戶可使用此文本。此外,能夠向伺服器進程附加調試器的用戶可在運行時從內存中檢索已解密的過程。 前兩天寫了一篇關於游標的介紹文章 ,下邊寫一個例子,將游標與存儲過程一起使用上: If Object_ID('dbo.GetMasterGoods') Is Not Null
Drop Proc dbo.GetMasterGoods
Go Create Proc GetMasterGoods
@MyCursor Cursor Varying Output
With Encryption
As
Set @MyCursor = Cursor
For
Select GoodsCode,GoodsName From Master_Goods
Open @MyCursor
Go --下邊建立另外一個存儲過程,用於遍歷游標輸出結果 Create Proc GetAllGoodsIDAndName
As Declare @GoodsCode varchar(18)
Declare @GoodsName nvarchar(20)
Declare @MasterGoodsCursor Cursor
Exec GetMasterGoods @MasterGoodsCursor out
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
While(@@Fetch_Status = 0)
Begin
Begin
Print @GoodsCode + ':' + @GoodsName
End
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
End
Close @MasterGoodsCursor
Deallocate @MasterGoodsCursor
Go 最後執行Exec GetAllGoodsIDAndName結果為以下內容 0003:品0003
0004:品0004
0005:123123
0006:品0006
0007:品0007
0008:品0008
0009:品0009
0010:品0010
0011:品0011
0012:品0012
0013:品0013
0014:品0014
⑶ 在SQL中存儲過程的一般語法是什麼
1、 創建語法
createproc|procerepro_name
[{@參數數據類型}[=默認值][output],
{@參數數據類型}[=默認值][output],
....
]
as
SQL_statements
2、 創建不帶參數存儲過程
--創建存儲過程
if(exists(select*fromsys.objectswherename='proc_get_student'))
dropprocproc_get_student
go
createprocproc_get_student
as
select*fromstudent;
--調用、執行存儲過程
execproc_get_student;
3、 修改存儲過程
--修改存儲過程
alterprocproc_get_student
as
select*fromstudent;
4、 帶參存儲過程
--帶參存儲過程
if(object_id('proc_find_stu','P')isnotnull)
dropprocproc_find_stu
go
createprocproc_find_stu(@startIdint,@endIdint)
as
select*fromstudentwhereidbetween@startIdand@endId
go
execproc_find_stu2,4;
5、 帶通配符參數存儲過程
--帶通配符參數存儲過程
if(object_id('proc_findStudentByName','P')isnotnull)
dropprocproc_findStudentByName
go
createprocproc_findStudentByName(@namevarchar(20)='%j%',@nextNamevarchar(20)='%')
as
select*fromstudentwherenamelike@nameandnamelike@nextName;
go
execproc_findStudentByName;execproc_findStudentByName'%o%','t%';
(3)sql資料庫存儲過程擴展閱讀:
SQL存儲過程優點:
1、重復使用。存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。
2、減少網路流量。存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。
3、安全性。參數化的存儲過程可以防止SQL注入式攻擊,而且可以將Grant、Deny以及Revoke許可權應用於存儲過程。
⑷ sql 存儲過程查詢語句
在資料庫中先創建存儲過程!具體代碼如下:
create proc sp_GetTesttableByname --sp_GetTesttableByname代表存儲過程名稱
as
begin
SELECT nickname,email FROM testtable WHERE name='張三' --存數過程的查詢語句
end
go
exec sp_GetTesttableByname; --查詢存儲過程結果
按下F5執行以上代碼之後 然後再在項目中寫調用存儲過程語句!希望我的回答對你有所幫助,謝謝採納!
⑸ 使用SQL語句創建存儲過程
使用SQL語句創建存儲的具體過程如下:
1、首先,打開企業管理器,選擇【工具】-【查詢分析器】:
⑹ SQL存儲過程如何調用存儲過程
1、首先先創建一個存儲過程,代碼如圖,存儲過程主要的功能是為表JingYan插入新的數據。
⑺ 資料庫存儲過程是什麼
問題一:sql資料庫中的存儲過程該怎麼理解 有什麼用啊? 存儲過程是SQL 語句和流程式控制制語句的預編譯 *** ,以一個名稱存儲並作為一個單元處理。存儲過程存儲在資料庫內,可由應用程序調用執行,而且允許用戶聲明變數、有條件執行以及其它強大的編程功能。
問題二:資料庫中什麼是存儲過程?作用是什麼? 存儲過程,就是帶有名字的一個程序塊。
存儲,是指這個程序塊創建了之後,是存儲在資料庫內部的,然後我們可以在自己寫的程序中通過某種手段去調用這段程序,然後這段程序就會做一件事,做什麼事?我們定義存儲過程的時候怎麼寫的,它到時候就做什麼;
過程,就是程序塊,說白了就是一段程序。
存儲過程,創建完成之後,就存儲在資料庫內部了,資料庫幫你記著,存儲過程創建的時候都有一個名字,將來你在你的程序當中,通過某種方式(不同編程語言有不同的方式),一般來講通過這個名字,去調用存儲過程,就像使用一個方法或者函數一樣,它就去做一件事!
不同的資料庫的存儲過程,都是用當前自己這個資料庫的編程語言來編寫的,比如Oracle的PL/SQL編程,等等。
自己寫一個就明白了,語法不用我多說了吧?
問題三:什麼叫作資料庫的存儲過程? 存儲過程就是將常用的或很復雜的工作,預先用SQL語句寫好並用一個指定的名稱存儲起來,並且這樣的語句是放在資料庫中的,還可以根據條件執行不同SQL語句, 那麼以後要叫資料庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。 存儲過程的優點 1.存儲過程只在創造時進行編譯即可,以後每次執行存儲過程都不需再重新編譯,而我們通常使用的SQL語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。 2.經常會遇到復雜的業務邏輯和對資料庫的操作,這個時候就會用SP來封裝資料庫操作。當對資料庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。可以極大的提高資料庫的使用效率,減少程序的執行時間,這一點在較大數據量的資料庫的操作中是非常重要的。在代碼上看,SQL語句和程序代碼語句的分離,可以提高程序代碼的可讀性。 3.存儲過程可以設置參數,可以根據傳入參數的不同重復使用同一個存儲過程,從而高效的提高代碼的優化率和可讀性。 4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權存儲過程的種類: (1)系統存儲過程:以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工作,如 sp_help就是取得指定對象的相關信息。 (2)擴展存儲過程 以XP_開頭,用來調用操作系統提供的功能exec master..xp_cmdshell 'ping 10.8.16.1' (3)用戶自定義的存儲過程,這是我們所指的存儲過程常用格式 模版:Create procere procee_name [@parameter data_type][output][with]{repile|encryption} as sql_statement 解釋:output:表示此參數是可傳回的 with {repile|encryption} repile:表示每次執行此存儲過程時都重新編譯一次;encryption:所創建的存儲過程的內容會被加密。
問題四:資料庫中存儲過程有什麼主要作用,或都說它的主要用途? 存儲過程的概念
存儲過程(Stored Procere)是一組預先編繹好的Transact-SQL語句。將其放在伺服器上,由用戶通過指定存儲過程的名字來執行它。存儲過程可以作為一個獨立的資料庫對象,也可以作為一個單元被用戶的應用程序調用。存儲過程可以接收和輸出參數,返回執行存儲過程的狀態值,還可以嵌套調用。
存儲過程同其他編程語言中的過程(Procere)類似,主要體現在以下幾個方面:
(1)存儲過程可以接收參數,並以接收參數的形式返回多個參數給調用存儲過程和批處理。
(2)包含執行資料庫操作的編程語句,也可以調用其他的存儲過程。
(3)向調用過程或批處理返回狀態值,以反映存儲過程的執行情況。
注意:存儲過程跟函數不同,存儲過程不能在被調用的位置上返回數據,也不能被應用在語句當中,例如不可以用類似「@Proc=存儲過程名」的方式使用存儲過程。但是,存儲過程可以使用變數的形式來返回參數。
存儲過程的優點表現在以下幾個方面:
(1)執行速度快
存儲過程在創建時就經過了語法檢查和性能優化,因此在執行時不必再重復這些步驟。存儲過程在第一次調用後,就駐留在內存中,不必再經過編譯和優化,所以執行速度很快。在有大量批處理的Transact-SQL語句要重復執行的時候,使用存儲過程可以極大地提高運行效率。
(2)模塊化程序設計
只需創建存儲過程一次,並將其存儲在資料庫中,可以在程序中多次調用該存儲過程。用戶可以獨立於應用程序而對存儲過程進行修改。
(3)減少網路通信量
存儲過程中可以包含大量的Transact-SQL語句。在進行調用時,只需要使用一條語句就可以實現,而不需要在網路中發送數百行代碼。
(4)保證系統的安全性
可以設置用戶通過存儲過程來對某些關鍵數據進行訪問,但不允許用戶直接使用Transact-SQL語句或企業管理器來對數據進行訪問。
問題五:資料庫存儲過程和函數的區別 函數分兩種,表值函數跟標量函數
表值函數最後要返回一個表變數,而標量函數最後要返回一個標量值
存儲過程即一組批處理,可以返回或不返回值,僅僅是執行其內部的全部語句
函數可以與一般sql語句一同編寫,而存儲過程不可以,需要單獨執行
問題六:資料庫編輯存儲過程是什麼意思 一般來說,程序員都希望編寫出來的程序能有最大化的應變能力,存儲過程的最大作用是可以降低代碼維護的工作量,很多需求的變化不用修改代碼進而發布程序,而只需要調整一下存儲過程即可實現
例如你打算開發一個報表,該報表會對資料庫的數據進行一定程度的加工,然後再呈現給用戶,那麼你的實現方法有兩個
1. 使用代碼調用SQL,取到基礎數據後,在程序代盯裡面進行加工,並呈現給用戶
2. 也可以編寫一段存儲過程,該存儲過程先取基礎數據,然後在存儲過程裡面進行數據加工,最後把最終的結果一次性的反饋給程序代碼,程序代碼只需要把執行完存儲過程的結果呈現給用戶即可
這兩個方法都可以實現你想實現的功能,但是如果萬一有一天需求變化了,用戶需要呈現的結果中增加或者減少了部分內容,那麼第一個方法就只能修改代碼了,而第二個方法只需要調整存儲過程即可實現
問題七:在SQL中存儲過程的一般語法是什麼? sql server存儲過程語法
存儲過程就是作為可執行對象存放在資料庫中的一個或多個SQL命令。
定義總是很抽象。存儲過程其實就是能完成一定操作的一組SQL語句,只不過這組語句是放在資料庫中的(這里我們只談SQL Server)。如果我們通過創建存儲過程以及在ASP中調用存儲過程,就可以避免將SQL語句同ASP代碼混雜在一起。這樣做的好處至少有三個:
第一、大大提高效率。存儲過程本身的執行速度非常快,而且,調用存儲過程可以大大減少同資料庫的交互次數。
第二、提高安全性。假如將SQL語句混合在ASP代碼中,一旦代碼失密,同時也就意味著庫結構失密。
第三、有利於SQL語句的重用。
在ASP中,一般通過mand對象調用存儲過程,根據不同情況,本文也介紹其它調用方法。為了方便說明,根據存儲過程的輸入輸出,作以下簡單分類:
1. 只返回單一記錄集的存儲過程
假設有以下存儲過程(本文的目的不在於講述T-SQL語法,所以存儲過程只給出代碼,不作說明):
/*SP1*/
CREATE PROCEDURE dbo.getUserList
as
set nocount on
begin
select * from dbo.[userinfo]
end
go
以上存儲過程取得userinfo表中的所有記錄,返回一個記錄集。通過mand對象調用該存儲過程的ASP代碼如下:
'**通過mand對象調用存儲過程**
DIM Mym,MyRst
Set Mym = Server.CreateObject(ADODB.mand)
Mym.ActiveConnection = MyConStr 'MyConStr是資料庫連接字串
Mym.mandText = getUserList '指定存儲過程名
Mym.mandType = 4 '表明這是一個存儲過程
Mym.Prepared = true '要求將SQL命令先行編譯
Set MyRst = Mym.Execute
Set Mym = Nothing
存儲嘩程取得的記錄集賦給MyRst,接下來,可以對MyRst進行操作。
在以上代碼中,mandType屬性表明請求的類型,取值及說明如下:
-1 表明mandText參數的類型無法確定
1 表明mandText是一般的命令類型
2 表明mandText參數是一個存在的表名稱
4 表明mandText參數是一個存儲過程的名稱
還可以通過Connection對象或Recordset對象調用存儲過程,方法分別如下:
'**通過Connection對象調用存儲過程**
DIM MyConn,MyRst
Set MyConn = Server.CreateObject(&qu......>>
問題八:T-SQL和存儲過程有什麼區別 20分 區別T-SQL是語言,存儲過程是資料庫一種對象
T-SQL 即 Transact-SQL,是 SQL 在 Microsoft SQL Server 上的增強版,它是用來讓應用程式與 SQL Server 溝通的主要語言。
Transact-SQL中的存儲過程,非常類似於Java語言中的方法,它可以重復調用。當存儲過程執行一次後,可以將語句緩存中,這樣下次執行的時候直接使用緩存中的語句。這樣就可以提高存儲過程的性能。
? 存儲過程的概念
存儲過程Procere是一組為了完成特定功能的SQL語句 *** ,經編譯後存儲在資料庫中,用戶通過指定存儲過程的名稱並給出參數來執行。
存儲過程中可以包含邏輯控制語句和數據操縱語句,它可以接受參數、輸出參數、返回單個或多個結果集以及返回值。
由於存儲過程在創建時即在資料庫伺服器上進行了編譯並存儲在資料庫中,所以存儲過程運行要比單個的SQL語句塊要快。同時由於在調用時只需用提供存儲過程名和必要的參數信息,所以在一定程度上也可以減少網路流量、簡單網路負擔。
問題九:資料庫存儲過程怎麼調用存儲過程 在存儲過程里用exec執行另一存儲過程名及它需要的參數就可以了
如 exec abc '1', '2' (abc 是存儲過程的名字, '1','2' 是它的參數)
⑻ 在SQL中存儲過程分為哪五類
1、目錄存儲過程
例如:sp_columns返回當前環境中可查詢的指定表或視圖的列信息。
sp_tables返回當前環境下可查詢的對象的列表(任何可出現在FROM子句中的對象)。
2、復制類存儲過程
例如:sp_addarticle創建項目並將其添加到發布中。此存儲過程在發布伺服器的發布資料庫上執行。
3、安全管理類存儲過程
例如:sp_addrole在當前資料庫創建新的Microsoft SQL Server角色。
sp_password添加或更改Microsoft SQL Server登錄的密碼。
4、分布式查詢存儲過程
例如:sp_foreignkeys返回引用主鍵的外鍵,這些主鍵在鏈接伺服器中的表上。
sp_primarykeys返回指定遠程表的主鍵列,每個鍵列佔一行。
5、擴展存儲過程
例如:xp_sendmail向指定的收件人發送郵件和查詢結果集附件。
xp_startmail啟動SQL郵件客戶端會話。
存儲過程的特點
1、存儲過程在伺服器端運行,執行速度快。
2、存儲過程執行一次後,其執行駐留在高速緩沖存儲器,在以後的操作中,只需從高速緩沖存儲器中調用已編譯好的二進制代碼執行,提高了系統性能。
3、確保資料庫的安全。使用存儲過程可以完成所有的資料庫操作。
4、降低網路負載,提高效率。
5、可以接受用戶參數,亦可返回參數。
6、作為一種安全機制來充分利用:通過對執行某一存儲過程的許可權進行限制,能夠實現對相應的數據的訪問許可權的限制,避免了非授權用戶對數據的訪問,保證了數據的安全。