给存储过程加上一个是否去重复的参数(sql server数据库)
这是我的一个存储过程 现在不能实现去重复:
USE [test]
GO
/****** Object: StoredProcedure [dbo].[testcc] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[uspGetPage]
(
@Tables nvarchar(1000), --表名
@Fields nvarchar(2000)='*', --字段
@PageIndex int=1, --第N页
@PageSize int=10, --每页的大小
@Where nvarchar(4000)='', --条件
@OrderBy nvarchar(200), --排序
@TotalRecord int = 0 output --符合条件记录数量
)
AS
BEGIN
Declare @SQL nvarchar(max)
-- @Where 处理
SELECT @Where=(CASE WHEN (@Where IS NULL OR @Where='') THEN '' ELSE ' Where '+@Where END)
--计算总记录数
set @SQL = 'select @Total = count(1) from ' + @Tables + @Where
EXEC sp_executesql @SQL,N'@Total int OUTPUT',@TotalRecord OUTPUT
--计算边界
SELECT @PageIndex=(CASE WHEN @PageIndex<1 THEN 1 ELSE @PageIndex-1 END)
--下面构造分页函数
SELECT @SQL='SELECT row_number() OVER (ORDER BY '+@ORDERBY+') AS _rowid, '+ @Fields + ' FROM ' + @Tables + @Where
--执行分页
Declare @EXECSQL varchar(max)
SELECT @EXECSQL='SET ROWCOUNT '+Convert(varchar(4),@PageSize)+'; WITH SP_TABLE AS( '+@SQL+' ) SELECT * FROM SP_TABLE WHERE _rowid > '+ Convert(varchar(50),(@PageIndex * @PageSize))+' '
EXEC(@EXECSQL)
--PRINT @EXECSQL
--返回页数
END
想请 各位 大神们 帮我改一下 加一个去重复
[解决办法]
try this,
USE [test]GO/****** Object: StoredProcedure [dbo].[testcc] ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER proc [dbo].[uspGetPage]( @Tables nvarchar(1000), --表名 @Fields nvarchar(2000)='*', --字段 @PageIndex int=1, --第N页 @PageSize int=10, --每页的大小 @Where nvarchar(4000)='', --条件 @OrderBy nvarchar(200), --排序 @TotalRecord int = 0 output --符合条件记录数量 )ASbeginDeclare @SQL nvarchar(max)-- @Where 处理SELECT @Where=(CASE WHEN (@Where IS NULL OR @Where='') THEN '' ELSE ' Where '+@Where END)--计算总记录数set @SQL = 'select @Total = count(1) from ' + @Tables + @WhereEXEC sp_executesql @SQL,N'@Total int OUTPUT',@TotalRecord OUTPUT --计算边界 SELECT @PageIndex=(CASE WHEN @PageIndex<1 THEN 1 ELSE @PageIndex-1 END) --下面构造分页函数 SELECT @SQL='select row_number() OVER (ORDER BY '+@ORDERBY+') AS _rowid,* from (SELECT distinct '+ @Fields + ' FROM ' + @Tables + @Where + ') t' --执行分页 Declare @EXECSQL varchar(max) SELECT @EXECSQL='SET ROWCOUNT '+Convert(varchar(4),@PageSize)+'; WITH SP_TABLE AS( '+@SQL+' ) SELECT * FROM SP_TABLE WHERE _rowid > '+ Convert(varchar(50),(@PageIndex * @PageSize))+' ' EXEC(@EXECSQL)--PRINT @EXECSQL--返回页数END
[解决办法]
--计算总记录数,这里估计也要去掉重复计算中记录数!set @SQL = 'select @Total = count(1) from (SELECT distinct '+ @Fields + ' FROM ' + @Tables + @Where + ') t'EXEC sp_executesql @SQL,N'@Total int OUTPUT',@TotalRecord OUTPUT
[解决办法]
USE [test]GO/****** Object: StoredProcedure [dbo].[testcc] ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER proc [dbo].[uspGetPage]( @Tables nvarchar(1000), --表名 @Fields nvarchar(2000)='*', --字段 @PageIndex int=1, --第N页 @PageSize int=10, --每页的大小 @Where nvarchar(4000)='', --条件 @OrderBy nvarchar(200), --排序 @TotalRecord int = 0 output, --符合条件记录数量 @noreplace bit=0 --为1时去重复 )ASBEGINDeclare @SQL nvarchar(max)-- @Where 处理SELECT @Where=(CASE WHEN (@Where IS NULL OR @Where='') THEN '' ELSE ' Where '+@Where END)/*加此段试试*/if @noreplace=1 --需去重复时begin set @tables='(select '+fields+' from '+@tables+@where+') as a' set @where=''end--计算总记录数set @SQL = 'select @Total = count(1) from ' + @Tables + @WhereEXEC sp_executesql @SQL,N'@Total int OUTPUT',@TotalRecord OUTPUT --计算边界 SELECT @PageIndex=(CASE WHEN @PageIndex<1 THEN 1 ELSE @PageIndex-1 END) --下面构造分页函数 SELECT @SQL='SELECT row_number() OVER (ORDER BY '+@ORDERBY+') AS _rowid, '+ @Fields + ' FROM ' + @Tables + @Where --执行分页 Declare @EXECSQL varchar(max) SELECT @EXECSQL='SET ROWCOUNT '+Convert(varchar(4),@PageSize)+'; WITH SP_TABLE AS( '+@SQL+' ) SELECT * FROM SP_TABLE WHERE _rowid > '+ Convert(varchar(50),(@PageIndex * @PageSize))+' ' EXEC(@EXECSQL)--PRINT @EXECSQL--返回页数END