pb 执行存储过程带参数_数据库存储过程
1. 存儲過程的類型:
(1) 用戶自定義存儲過程
自定義存儲過程即用戶使用T_SQL語句編寫的、為了實現(xiàn)某一特定業(yè)務需求,在用戶數(shù)據(jù)庫中編寫的T_SQL語句集合,自定義存儲過程可以接受輸入?yún)?shù)、向客戶端返回結果和信息,返回輸出參數(shù)等。創(chuàng)建自定義存儲過程時,存儲過程名前加上"##"表示創(chuàng)建了一個全局的臨時存儲過程;存儲過程前面加上"#"時,表示創(chuàng)建的局部臨時存儲過程。局部臨時存儲過程只能在創(chuàng)建它的回話中使用,會話結束時,將被刪除。這兩種存儲過程都存儲在tempdb數(shù)據(jù)庫中。
用戶定義的存儲過程分為兩類:T_SQL 和CLR
T_SQL:存儲過程是值保存的T_SQL語句集合,可以接受和返回用戶提供的參數(shù),存儲過程也可能從數(shù)據(jù)庫向客戶端應用程序返回數(shù)據(jù)。
CLR存儲過程是指引用Microsoft.NET Framework公共語言的方法存儲過程,可以接受和返回用戶提供的參數(shù),它們在.NET Framework程序集是作為類的公共靜態(tài)方法實現(xiàn)的。
(2) 擴展存儲過程
擴展存儲過程是以在SQL SERVER環(huán)境外執(zhí)行的動態(tài)連接(DLL文件)來實現(xiàn)的,可以加載到SQL SERVER實例運行的地址空間中執(zhí)行,擴展存儲過程可以用SQL SERVER擴展存儲過程API編程,擴展存儲過程以前綴"xp_"來標識,對于用戶來說,擴展存儲過程和普通話存儲過程一樣,可以用相同的方法來執(zhí)行。
(3) 系統(tǒng)存儲過程
系統(tǒng)存儲過程是 SQL Server系統(tǒng)自身提供的存儲過程,可以作為命令執(zhí)行各種操作。
系統(tǒng)存儲過程主要用來從系統(tǒng)表中獲取信息,使用系統(tǒng)存儲過程完成數(shù)據(jù)庫服務器的管理工作,為系統(tǒng)管理員提供幫助,為用戶查看數(shù)據(jù)庫對象提供方便,系統(tǒng)存儲過程位于數(shù)據(jù)庫服務器中,并且以sp_開頭,系統(tǒng)存儲過程定義在系統(tǒng)定義和用戶定義的數(shù)據(jù)庫中,在調用時不必在存儲過程前加數(shù)據(jù)庫限定名。例如:sp_rename系統(tǒng)存儲過程可以修改當前數(shù)據(jù)庫中用戶創(chuàng)建對象的名稱,sp_helptext存儲過程可以顯示規(guī)則,默認值或視圖的文本信息,SQL SERVER服務器中許多的管理工作都是通過執(zhí)行系統(tǒng)存儲過程來完成的,許多系統(tǒng)信息也可以通過執(zhí)行系統(tǒng)存儲過程來獲得。
系統(tǒng)存儲過程創(chuàng)建并存放在與系統(tǒng)數(shù)據(jù)庫master中,一些系統(tǒng)存儲過程只能由系統(tǒng)管理員使用,而有些系統(tǒng)存儲過程通過授權可以被其它用戶所使用。
2.Sql存儲過程
(1)創(chuàng)建存儲過程
使用 create Procedure語句來創(chuàng)建存儲過程,存儲過程名稱在該語句之后,as關鍵字標示存儲過程主體的開始,存儲過程有多個sql語句組成,例如下面的語句創(chuàng)建一個名為usp_getAllEmployees的存儲過程,用于從employeeDepartment表中檢索數(shù)據(jù)
Create Procedure usp_getAllEmployees
As
Select LastName,FirstName,JobTitle,Department
From employeeDepartment
要執(zhí)行一個存儲過程,可以使用execute語句:
Execute usp_getAllEmployees
存儲過程的參數(shù)
存儲過成人能夠通過參數(shù)與調用程序通訊。參數(shù)定義應當出現(xiàn)在存儲過程名稱的后面,as的前面,當程序執(zhí)行存儲過程時,可通過存儲過程的參數(shù)向該存儲過程傳遞值,也可以output參數(shù)將值返回至調用程序
1、指定參數(shù)的名稱和數(shù)據(jù)類型
參數(shù)名稱應當以@開始,以后的字符可以是遵守對象標識符的任意字符,并以@@開頭,因為這是用于內置函數(shù)的標識符號,例如下面創(chuàng)建的usp_GetProduct存儲過程包含@standardCost和@listPrice兩個參數(shù),參數(shù)的數(shù)據(jù)類型均是money
Create produce usp_GetProduct
@standardCost money,@listPrice money
As
Select name, standardCost, listPrice from product
Where standardCost>@ standardCost and listPrice> @listPrice
執(zhí)行存儲過程時,既可以通過顯式的方式指定參數(shù)名稱并分配適當?shù)闹?#xff0c;也可以直接分配參數(shù)值,如果使用了顯式方式,則按任意順序提供參數(shù),如果未指定參數(shù)名稱,則必須按參數(shù)在存儲過程定義的時候的順序來提供。
Excute usp_GetProduct @ listPrice=100,@standardCost=10
Excute usp_GetProduct 10 ,100
2、為參數(shù)指定默認值
在參數(shù)定義中可以為可選參數(shù)指定一個,默認值,執(zhí)行該存儲過程時,如果未指定其他值,則使用默認值
Create produce usp_GetProduct
@standardCost money=0,@listPrice money
As
Select name, standardCost, listPrice from product
Where standardCost>@ standardCost and listPrice> @listPrice
執(zhí)行該存儲過程,可以只為@listPrice指定參數(shù)
Excute usp_GetProduct @ listPrice=100
由于具有默認參數(shù)通常是可選參數(shù),所以建議將他們放置在參數(shù)列表的末尾以便于調用。
對于字符參數(shù),在參數(shù)傳遞時可以指定通配符
3、指定輸出參數(shù)
默認情況下,所有的參數(shù)均為輸出參數(shù),要指定輸出參數(shù),必須在參數(shù)定義中使用output關鍵字。當存儲過程退出時,它將向調用程序返回輸出參數(shù)的當前值。,例如,下面創(chuàng)建的存儲過程定義了一個輸出參數(shù)@productCount,用于返回ListPrice大于指定產品的數(shù)量
Create produce usp_GetProduct
@productCount int output,
@listPrice money
As
set @productCount= (select count(id) from product
Where listPrice> @listPrice)
2. 修改存儲過程
如果需要修改存儲過程中的語句或者參數(shù),可以刪除并重新創(chuàng)建該存儲過程,也可以使用alter producedure語句更改該存儲過程。刪除并重新建時,與該存儲過程關聯(lián)的所有權限將丟失,更改時,將更改過程或者參數(shù)定義,但為該存儲過程定義的權限將保留,將不會影響任何相關的存儲過程或觸發(fā)器
Alrter produce usp_GetProduct
@standardCost money=0,@listPrice money
As
Select name, standardCost, listPrice from product
Where standardCost>@ standardCost and listPrice> @listPrice
3. 存儲過程的重新編譯
1、指定在下次執(zhí)行時重新編譯
可以使用sp_recompile系統(tǒng)存儲過程指定在下次執(zhí)行存儲過程或觸發(fā)器進行重新編譯
2、從sql server 2005開始,引入了對存儲過程執(zhí)行語句級重新編譯的功能,也就是說在重新編譯存儲過程時,值編譯導致重新編譯的語句,而不編譯整個存儲過程。
要使用此功能,應當在語句中包含recomple查詢提示,recomeple指示數(shù)據(jù)庫引擎在執(zhí)行查詢后,丟棄為其生成的查詢計劃,從而在下次執(zhí)行時強制編譯查詢計劃,如果未指定recompile。數(shù)據(jù)庫將緩存查詢計劃并從新使用它們
3、每次執(zhí)行時重新編譯村重過程
在創(chuàng)建存儲過程時指定with recompile選項,強制在執(zhí)行存儲過程時對其進行重新編譯,指定該選項時,數(shù)據(jù)庫引擎將部位該存儲過程緩存執(zhí)行計劃,而是在每次執(zhí)行時都重新編譯
4.創(chuàng)建帶游標參數(shù)的存儲過程
if (object_id('book_cursor', 'P') is not null)
drop proc book_cursor
go
create proc book_cursor
@bookCursor cursor varying output
as
set @bookCursor=cursor forward_only static for
select book_id,book_name,book_auth from books
open @bookCursor;
go
--調用book_cursor存儲過程
declare @cur cursor,
@bookID int,
@bookName varchar(20),
@bookAuth varchar(20);
exec book_cursor @bookCursor=@cur output;
fetch next from @cur into @bookID,@bookName,@bookAuth;
while(@@FETCH_STATUS=0)
begin
fetch next from @cur into @bookID,@bookName,@bookAuth;
print 'bookID:'+convert(varchar,@bookID)+' , bookName: '+ @bookName
+' ,bookAuth: '+@bookAuth;
end
close @cur --關閉游標
DEALLOCATE @cur; --釋放游標
5.創(chuàng)建分頁存儲過程
if (object_id('book_page', 'P') is not null)
drop proc book_page
go
create proc book_page(
@TableName varchar(50), --表名
@ReFieldsStr varchar(200) = '*', --字段名(全部字段為*)
@OrderString varchar(200), --排序字段(必須!支持多字段不用加order by)
@WhereString varchar(500) =N'', --條件語句(不用加where)
@PageSize int, --每頁多少條記錄
@PageIndex int = 1 , --指定當前為第幾頁
@TotalRecord int output --返回總記錄數(shù)
)
as
begin
--處理開始點和結束點
Declare @StartRecord int;
Declare @EndRecord int;
Declare @TotalCountSql nvarchar(500);
Declare @SqlString nvarchar(2000);
set @StartRecord = (@PageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @PageSize - 1
SET @TotalCountSql= N'select @TotalRecord = count(*) from ' + @TableName;--總記錄數(shù)語句
SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查詢語句
--
IF (@WhereString! = '' or @WhereString!=null)
BEGIN
SET @TotalCountSql=@TotalCountSql + ' where '+ @WhereString;
SET @SqlString =@SqlString+ ' where '+ @WhereString;
END
--第一次執(zhí)行得到
--IF(@TotalRecord is null)
-- BEGIN
EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output;--返回總記錄數(shù)
-- END
----執(zhí)行主語句
set @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' + ltrim(str(@EndRecord));
Exec(@SqlString)
END
--調用分頁存儲過程book_page
exec book_page 'books','*','book_id','',3,1,0;
--
declare @totalCount int
exec book_page 'books','*','book_id','',3,1,@totalCount output;
select @totalCount as totalCount;--總記錄數(shù)。
總結
以上是生活随笔為你收集整理的pb 执行存储过程带参数_数据库存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牙套可以补吗
- 下一篇: 新华字典mysql_JAVA面试(1)M