sql server 儲存過程中執行帶輸出引數的動態 sql
阿新 • • 發佈:2019-02-10
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=1205) AND@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 (@err, 16,1) WITHLOG
return-100
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
(
@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(
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]
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=1205) AND@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 (@err, 16,1) WITHLOG
return-100
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO