sql server 數據庫存儲過程

最近由於工作原因使用到MS-SQLSERVER,發現之前的東西大多已經忘記,爲了加強記憶,特總結MS-SQLSERVER的一些知識在最近幾篇文中:

存儲過程定義:

     存儲過程是用戶爲了完成某些特定功能定義的一塊SQL程序集合,類似於C++中的函數;存儲過程在編譯後存儲在數據庫中。用戶通過存儲過程名和設定參數調用存儲過程。

存儲過程與觸發器、函數的區別:

    存儲過程就像是數據庫中的全局函數,能夠被用戶調用,能夠操作每張表,能夠調用存儲過程和函數,同時能夠輸入和返回多個參數。觸發器是對於特定表的特定操作的,這點從觸發器的創建就可以看出:CREATE TIGGER [tigger_Name] ON [table_name]……;數據庫中的函數不能夠返回參數只能返回表對象或者值,另外函數可以使用在查詢語句中。

創建、修改、執行存儲過程:

    創建存儲過程:

CREATE PROC proc_name
@parm1,
@parm2,
...
@parmOut1 output,
...
as
begin
...
end

修改存儲過程只需要將上面代碼中的CREATE修改爲ALTER就可以。
執行存儲過程的語句爲exec proc_name {參數表};

向存儲過程傳遞數據集:  
  MS-SQL並沒有提供向proc中傳遞數據集的功能,如果要向存儲過程中傳遞一組數據,一般的方法是將數據拼接成字符串,然後在存儲過程中將字符串參數通過函數CHARINDEX()和SUBSTRING()拆分爲單個的數據,由於數據庫中沒有數組的概念,拆分後的數據要存儲在臨時表中,創建臨時表跟普通的表一樣,只是要在表名稱中加上'#'或者‘##’,‘#’表示局部臨時表,‘##’表示全局臨時表。   另外,也可以通過對XML文件的操作來傳遞數據集,具體參見MS-SQLSERVER的幫助文檔。

如下:

declare @prePos int;
declare @curPos int;
declare @price varchar(30);
declare @detail_id varchar(10);
declare @idPos int;
set @prePos = 1;
set @curPos = 1;
set @idPos  = 1;
		
create table #tb_price(id int not null, AcceptPrice dec(20, 7));
while(@prePos < LEN(@priceAll))
begin
	    set @curPos = CHARINDEX(';', @priceAll, @prePos);
	    set @idPos  = CHARINDEX(',', @priceAll, @prePos);
	    if @curPos > 0
		begin
		    set @price = SUBSTRING(@priceAll, @idPos + 1, @curPos - @idPos - 1);
		    set @detail_id = SUBSTRING(@priceAll, @prePos, @idPos - @prePos);
				
		    Insert into #tb_price
		    values(CONVERT(INT, @detail_id) ,CONVERT(dec(20, 7), @price));
				
		    set @prePos = @curPos + 1;
		end
		else
		    break;
end


存儲過程和事務   
 事務:事務具有原子性、唯一性、隔離性和持久性的特點。而存儲過程一般爲多個語句的集合,一般要保證整個存儲過程的可靠性和整個程序的完整性,而在程序中添加事務。一般情況下,在begin tran語句前添加set xact_abort on或者set xact_abort off,語句來設定事務的錯誤回滾(set xact_abort on表示錯誤回滾整條語句,set xact_abort off表示錯誤時回滾錯誤語句)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章