首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

给存储过程加下一个是否去重复的参数(sql server数据库)

2012-09-28 
给存储过程加上一个是否去重复的参数(sql server数据库)这是我的一个存储过程 现在不能实现去重复:USE [te

给存储过程加上一个是否去重复的参数(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,

SQL code
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
[解决办法]
SQL code
--计算总记录数,这里估计也要去掉重复计算中记录数!set @SQL = 'select @Total = count(1) from (SELECT distinct '+ @Fields + ' FROM ' + @Tables + @Where + ') t'EXEC sp_executesql @SQL,N'@Total int OUTPUT',@TotalRecord OUTPUT
[解决办法]
SQL code
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 

热点排行