日期:2014-05-17  浏览次数:20619 次

给存储过程加上一个是否去重复的参数(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 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,* 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 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, --符合条件记录数量
 @noreplace bit=0 --为1时去重复
 )
AS
BEGIN

Declare @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