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

postxxxxx 2012-09-20 06:01:46
这是我的一个存储过程 现在不能实现去重复:
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
想请 各位 大神们 帮我改一下 加一个去重复
...全文
118 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
postxxxx 2012-09-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

写漏了distinct
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),……
[/Quote]
不好意思,刚才试了一下你的 也是可以的 ,太激动啦
postxxxxx 2012-09-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

各位大侠们 我逐个试了你们的方法 ,但都是报同一个错误 :

列名 'Id' 无效。 Id 为主键, 如果我在检索的字段中 不写Id 就报上述错误,写了Id不会报错,但是没有去掉重复
[/Quote]
不好意思,刚才试了一下你的 也是可以的 ,太激动啦
postxxxxx 2012-09-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

SQL code

--计算总记录数,这里估计也要去掉重复计算中记录数!
set @SQL = 'select @Total = count(1) from (SELECT distinct '+ @Fields + ' FROM ' + @Tables + @Where + ') t'

EXEC sp_executesql @SQL,N'@Total int OUTPUT',@TotalR……
[/Quote]
这是可以的,在此也感谢1楼
postxxxxx 2012-09-21
  • 打赏
  • 举报
回复
各位大侠们 我逐个试了你们的方法 ,但都是报同一个错误 :

列名 'Id' 无效。 Id 为主键, 如果我在检索的字段中 不写Id 就报上述错误,写了Id不会报错,但是没有去掉重复
cxmcxm 2012-09-20
  • 打赏
  • 举报
回复
写漏了distinct

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 distinct '+fields+' from '+@tables+@where+') as a'
set @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

cxmcxm 2012-09-20
  • 打赏
  • 举报
回复
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 + @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
AcHerat 2012-09-20
  • 打赏
  • 举报
回复

--计算总记录数,这里估计也要去掉重复计算中记录数!
set @SQL = 'select @Total = count(1) from (SELECT distinct '+ @Fields + ' FROM ' + @Tables + @Where + ') t'

EXEC sp_executesql @SQL,N'@Total int OUTPUT',@TotalRecord OUTPUT
唐诗三百首 2012-09-20
  • 打赏
  • 举报
回复
try this,

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

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧