日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Sqlserver 通用存储过程(二) 联合主键

發(fā)布時間:2023/12/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sqlserver 通用存储过程(二) 联合主键 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
CREATE?PROC?P_public_ViewPage
????
/**//**//**//*
????????no_mIss?通用分頁存儲過程?2007.3.1??QQ:34813284
????????適用于聯(lián)合主鍵/單主鍵/存在能確定唯一行列/存在能確定唯一行的多列?(用英文,隔開)
????????調(diào)用:
????????????第一頁查詢時返回總記錄和總頁數(shù)及第一頁記錄:
????????????EXECUTE?P_public_ViewPage_per?'TableName','col1,col2,col3,col4','pk1,pk2,pk3',
????????????????'col5>0?and?col7<9','pk1?asc,pk2?asc,pk3?asc',0,10,1,
????????????????@TotalCount?OUTPUT,@TotalPageCount?OUTPUT
????????????其它頁調(diào)用,比如第89頁(假設(shè)第一頁查詢時返回總記錄為2000000):
????????????EXECUTE?P_public_ViewPage_per?'TableName','col1,col2,col3,col4','pk1,pk2,pk3',
????????????????'col5>0?and?col7<9','pk1?asc,pk2?asc,pk3?asc',2000000,10,89,
????????????????@TotalCount?OUTPUT,@TotalPageCount?OUTPUT
????
*/


????
@TableName?VARCHAR(200),?????--表名
????@FieldList?VARCHAR(2000),????--顯示列名
????@PrimaryKey?VARCHAR(100),????--單一主鍵或唯一值鍵或聯(lián)合主鍵列表(用英文,隔開)或能確定唯一行的多列列表(用英文,隔開)
????@Where?VARCHAR(1000),????????--查詢條件?不含'where'字符
????@Order?VARCHAR(1000),????????--排序?不含'order?by'字符,用英文,隔開??
????@RecorderCount?INT,??????????--記錄總數(shù)?0:會返回總記錄
????@PageSize?INT,???????????????--每頁輸出的記錄數(shù)
????@PageIndex?INT,??????????????--當(dāng)前頁數(shù)
????@TotalCount?INT?OUTPUT,??????--返回記錄總數(shù)
????@TotalPageCount?INT?OUTPUT???--返回總頁數(shù)
AS

????
SET?NOCOUNT?ON
????
????
SET?@FieldList?=?REPLACE(@FieldList,'?','')
????
IF?@FieldList?=?'*'?
????????
BEGIN?SET?@FieldList?=?'A.*'END
????
ELSE
????????
BEGIN
????????????
SET?@FieldList?=?'A.'?+?REPLACE(@FieldList,',',',A.')
????????
END
????
????
WHILE?CHARINDEX(',?',@Order)>0
????
BEGIN
????????
SET?@Order?=?REPLACE(@Order,',?',',')
????
END

????
IF?ISNULL(@TableName,'')?=?''?OR?ISNULL(@PrimaryKey,'')?=?''????????
????????
OR?@RecorderCount?<?0?OR?@PageSize?<?0?OR?@PageIndex?<?0
????
BEGIN????????
????????
RETURN
????
END
?
????
DECLARE?@new_where1?VARCHAR(1000)
????
DECLARE?@new_where2?VARCHAR(1000)
????
DECLARE?@new_where3?VARCHAR(1000)
????
DECLARE?@new_where4?VARCHAR(1000)
????
DECLARE?@new_order1?VARCHAR(1000)
????
DECLARE?@new_order2?VARCHAR(1000)
????
DECLARE?@Fields?VARCHAR(1000)
????
DECLARE?@Sql?VARCHAR(8000)
????
DECLARE?@SqlCount?NVARCHAR(4000)

????
SET?@Fields?=?@PrimaryKey?+?','
????
SET?@new_where2?=?''
????
SET?@new_where4?=?''


????
IF?ISNULL(@where,'')?=?''
????????
BEGIN
????????????
SET?@new_where1?=?'?'
????????????
SET?@new_where3?=?'?WHERE?'
????????
END
????
ELSE
????????
BEGIN????????????
????????????
SET?@new_where1?=?'?WHERE?'?+?@where?+?'?'
????????????
SET?@new_where3?=?'?WHERE?1=1?'?
????????????????????
+?REPLACE('?AND?'?+?@where,'?AND?','?AND?A.')+?'?AND?'
????????
END
????
????
WHILE?CHARINDEX(',',@Fields)>0
????
BEGIN
????????
SET?@new_where2?=?@new_where2?
????????????
+?'A.'?+?LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1))
????????????
+?'?=?B.'?+?LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1))?+?'?AND?'
????????
SET?@new_where4?=?@new_where4?
????????????
+?'B.'?+?LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1))?+?'?IS?NULL?AND?'
????????
SET?@Fields?=?SUBSTRING(@Fields,CHARINDEX(',',@Fields)+1,LEN(@Fields))
????
END
????
SET?@new_where2?=?LEFT(@new_where2,LEN(@new_where2)-4)
????
SET?@new_where4?=?LEFT(@new_where4,LEN(@new_where4)-4)

????
IF?ISNULL(@order,'')?=?''?
????????
BEGIN
????????????
SET?@new_order1?=?''
????????????
SET?@new_order2?=?''
????????
END
????
ELSE
????????
BEGIN
????????????
SET?@new_order1?=?'?ORDER?BY?'?+?@Order
????????????
SET?@new_order2?=?'?ORDER?BY?'?
????????????????????
+?RIGHT(REPLACE(','?+?@Order,',',',?A.'?),
????????????????????????????
LEN(REPLACE(','?+?@Order,',',',?A.'?))-1)
????????
END

????
SET?@SqlCount?=?'SELECT?@TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'
????????????????????
+?CAST(@PageSize?AS?VARCHAR)+')?FROM?'?+?@TableName?
????????????????????
+?'?A?'?+??@new_where1
????
????
IF?@RecorderCount?=?0
????????
BEGIN
?????????????
EXEC?SP_EXECUTESQL?@SqlCount,N'@TotalCount?INT?OUTPUT,@TotalPageCount?INT?OUTPUT',
???????????????????????????????
@TotalCount?OUTPUT,@TotalPageCount?OUTPUT
????????
END
????
ELSE
????????
BEGIN
?????????????
SELECT?@TotalCount?=?@RecorderCount????????????
????????
END

????
IF?@PageIndex?>?CEILING((@TotalCount+0.0)/@PageSize)
????????
BEGIN
????????????
SET?@PageIndex?=?CEILING((@TotalCount+0.0)/@PageSize)
????????
END
????
IF?@PageIndex?=?1
????????
BEGIN
????????????
SET?@Sql?=?'SELECT?TOP?'?+?STR(@PageSize)?+?'?'?+?@FieldList?+?'?FROM?'?
???????????????????????
+?@TableName?+?'?A'+?@new_where1?+?@new_order1
????????
END
????
ELSE
????????
BEGIN
????????????
SET?@Sql?=?'SELECT?TOP?'?+?STR(@PageSize)?+?'?'?+?@FieldList?+?'?FROM?'?
???????????????????????
+?@TableName?+?'?A?LEFT?JOIN?(SELECT?TOP?'?
???????????????????????
+?STR(@PageSize*(@PageIndex-1))?
???????????????????????
+?'?'?+?@PrimaryKey?+?'?FROM?'?+?@TableName?+?@new_where1
???????????????????????
+?@new_order1?+?'?)B?ON?'?+?@new_where2?+?@new_where3?
???????????????????????
+?@new_where4?+?@new_order2
????????
END

EXEC(@Sql)
GO

轉(zhuǎn)載于:https://www.cnblogs.com/liulf/archive/2009/02/17/1392637.html

總結(jié)

以上是生活随笔為你收集整理的Sqlserver 通用存储过程(二) 联合主键的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。