国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

存儲過程中如何執行帶輸出參數的動態SQL

2024-07-21 02:43:00
字體:
來源:轉載
供稿:網友
SQL Server存儲過程中執行帶輸出參數的動態sql是很多人經常碰到的問題,比如根據一些條件查詢列表,并返回記錄數等。下面是一個參考示例,查詢用戶列表,它可以利用臨時表實現翻頁,并帶有死鎖和超時檢測功能。

CREATE PRocedure pUserList

(

@UserType char(2),

@pagenum int,

@perpagesize int,

@pagetotal int out,

@rowcount int out

)

as

set nocount on

DECLARE @Err INT,@ErrCounter INT

declare @sql nvarchar(2000) --聲明動態sql執行語句

declare @pagecount int --當前頁數

declare @sWhere nvarchar(200)

declare @sOrder nvarchar(100)

set @sWhere = ' where 1=1 '

if not(@UserType is null)

set @sWhere = @sWhere + ' and UserType = ' + @UserType

set @sOrder = ' order by UserID '

--取得當前數據庫的記錄總數

declare @row_num int

LockTimeOutRetry:

--創建臨時表,作為數據過濾

create table #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(@perpagesize as varchar)

+ ' UserID,LoginName,RealName from dbo.[User]' + @sWhere + @sOrder

exec sp_executesql @sql

SET @Err = @@ERROR

IF @Err <> 0 GOTO ErrorHandler

return 0

end

else

begin

set @row_num = (@pagenum-1) * @perpagesize

set @pagecount = @row_num

set @sql=N'insert #change (T_id) select top '

+ cast(@pagecount as varchar) + ' 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(@perpagesize as varchar) + ' 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 <> 0 GOTO ErrorHandler

return 0

end

end

else

begin

set @sql = 'select UserID,LoginName,RealName

from dbo.[User]' + @sWhere + @sOrder

exec sp_executesql @sql

SET @Err = @@ERROR

IF @Err <> 0 GOTO ErrorHandler

return 0

end

ErrorHandler:

IF (@Err = 1222 OR @Err = 1205) AND @ErrCounter = 5

BEGIN

RAISERROR ('Unable to Lock Data after five attempts.', 16,1)

return -100

END

IF @Err = 1222 OR @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) WITH LOG

return -100

GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 山阳县| 琼结县| 河西区| 福州市| 河池市| 临泉县| 霸州市| 呼玛县| 宜宾县| 明光市| 微山县| 通山县| 施秉县| 拉孜县| 印江| 庄河市| 石柱| 长寿区| 上犹县| 吴忠市| 山东省| 汉寿县| 沙雅县| 四平市| 原阳县| 靖边县| 衡水市| 三门县| 漳平市| 同江市| 诸暨市| 利辛县| 泰来县| 正定县| 马关县| 绥棱县| 来宾市| 祥云县| 金堂县| 长丰县| 沧州市|