1. 程式人生 > >sql server 儲存過程中執行帶輸出引數的動態 sql

sql server 儲存過程中執行帶輸出引數的動態 sql

CREATEprocedure pUserList
(
    
@UserTypechar(2),
    
@pagenumint,
    
@perpagesizeint,
    
@pagetotalint out,
    
@rowcountint out
)
as
    
set nocount on 

    
DECLARE@ErrINT,@ErrCounterINT
    
declare@sqlnvarchar(2000--宣告動態sql執行語句 
declare@pagecountint--當前頁數 
declare@sWherenvarchar(200)
    
declare@sOrdernvarchar(
100)

    
set@sWhere=' where 1=1 '
    
ifnot(@UserTypeisnull)
    
set@sWhere=@sWhere+' and UserType = '+@UserType
    
set@sOrder=' order by UserID '

    
--取得當前資料庫的記錄總數 
declare@row_numint 

    LockTimeOutRetry:

    
--建立臨時表,作為資料過濾 
createtable #change (T_id int


    
set@sql='select @row_num=count(*) from dbo.[User]
'+@sWhere
    
exec sp_executesql @sql,N'@row_num int output'@row_num output

    
if@row_num%@perpagesize=0 
        
set@pagetotal=@row_num/@perpagesize
    
else
        
set@pagetotal=@row_num/@perpagesize+1

    
set@rowcount=@row_num

    
if@row_num>@perpagesize
    
begin
        
set@row_num=@pagenum*@perpagesize
 

        
if@row_num=@perpagesize 
        
begin
            
set@sql= N'select top '+cast(@perpagesizeasvarchar+' UserID,LoginName,RealName from dbo.[User]'+@sWhere+@sOrder
            
exec sp_executesql @sql 

            
SET@Err=@@ERROR
            
IF@Err<>0GOTO ErrorHandler 

            
return0
        
end
        
else
        
begin 
            
set@row_num= (@pagenum-1*@perpagesize 
            
set@pagecount=@row_num 
            
set@sql=N'insert #change (T_id) select top '+cast(@pagecountasvarchar+' UserID from dbo.[User] '+@sWhere+' and UserID not in (select T_id from #change)'+@sOrder 
            
exec sp_executesql @sql 
            
set@sql= N'select top '+cast(@perpagesizeasvarchar+' UserID,LoginName,RealName from dbo.[User] '+@sWhere+' and UserID not in (select T_id from #change)'+@sOrder 
            
exec sp_executesql @sql

            
SET@Err=@@ERROR
            
IF@Err<>0GOTO ErrorHandler 

            
return0

        
end
    
end
    
else
    
begin
        
set@sql='select UserID,LoginName,RealName
        from dbo.[User]
'+@sWhere+@sOrder
        
exec sp_executesql @sql

        
SET@Err=@@ERROR
        
IF@Err<>0GOTO ErrorHandler 

        
return0
    
end 

    ErrorHandler:
    
IF (@Err=1222OR@Err=1205AND@ErrCounter=5
    
BEGIN 
        
RAISERROR ('Unable to Lock Data after five attempts.'16,1
        
return-100
    
END
    
IF@Err=1222OR@Err=1205-- Lock Timeout / Deadlock
BEGIN
        
WAITFOR DELAY '00:00:00.25'
        
SET@ErrCounter=@ErrCounter+1
        
GOTO LockTimeOutRetry
    
END
-- else unknown error
RAISERROR (@err16,1WITHLOG
return-100

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO