alter procedure [dbo].[usp_syn_kmbs]
@batchid int --輸入引數 --如果宣告output為輸出引數
asbegin
declare @username varchar --宣告變數
declare @cellphone varchar
declare @storecode varchar
declare @sid int
declare cur cursor for --定義游標
select [sid],username, cellphone,storecode from kmbs_source where bathcid=@batchid
open cur--開啟游標
fetch next from cur into @sid,@username,@cellphone,@storecode --把提取操作的列資料放到區域性變數中
while(@@fetch_status=0) --游標讀取下一條資料是否成功
begin
declare @isin int
declare @autoid int
select @isin=isnull([dkr_id],0) from [kmbs_register] where [dkr_cellphone]=@cellphone
if @isin=0
begin
insert into [kmbs_register]
([dkr_sid]
,[dkr_name]
,[dkr_nickname]
,[dkr_cellphone]
,[dkr_storecode]
,[createdate]
,[updatedate]
,[dkr_isnew]
,[dkr_isfinish]
,[dkr_caller],*****id)
values(@sid,@username,@username,@cellphone,@storecode,getdate(),getdate(),0,0,0,@batchid)
select @autoid= @@identity
select @isin=isnull(dre_id,0) from register where dre_cellphone=@cellphone
if @isin>0
begin
update [kmbs_register] set dkr_dre_id=@isin where dkr_id=@autoid
end
endelse
begin
update kmbs_source set isin=@isin where [sid]=@sid
endfetch next from cur into @sid,@username,@cellphone,@storecode --讀取下一條資料記錄放到區域性變數中,變數的數目必須與游標選擇列表中的列的數目一致
endclose cur--關閉游標
deallocate cur--刪除游標
update kmbs_batch set
repeatnumber=(select count(*) from kmbs_source where batchid=@batchid and isin is not null)
,successnumber=(select count(*) from kmbs_register where batchid=@batchid)
,updatedate=getdate()
,total=(select count(*) from kmbs_source where batchid=@batchid)
,[state]=2
where batchid=@batchid
end
整體看上去沒有錯誤,但細心的童鞋會發現問題:
1、varchar未定義長度
2、if @isin=0 會不被執行,因為查出來的結果集有可能為null 故在下面做一下處理set @isin = isnull(@isin,0) 補救.
3、 由於 select @isin=isnull([dkr_id],0) 不會被執行,所以導致變數一直不會更新
所以在查詢之前先設定一下:set @isin=null 最後進行一下優化處理:在頭部宣告時加上set nocount on;
SQLServer 建立儲存過程範例
use 資料庫名稱 goset ansi nulls on goset quoted identifier on gocreate procedure dbo 儲存過程名稱 引數名稱1 char 20 引數名稱2 資料型別 長度 as begin 定義變數 declare 變數名稱 資料型別 長度 ...
mysql簡單儲存過程範例
範例 begin 定義引數 declare carid int 10 declare v count int declare done int default 1 乙個游標 cursor 可以被看作指向結果集 a set of rows 中一行的指標 pointer declare logistic...
mysql 儲存過程 範例
範例 drop procedure if exists proc delimiter 設定mysql 結束符 否則有可能報莫名其妙的 near at line 錯誤 create oracle or replace procedure proc in iid int,in ipid int out ...