第一次写存储过程,错误若干多。。。请前辈们帮忙看看。。。

muxrwc 2007-08-07 01:18:30
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER PROCEDURE [dbo].[cpage] (
@page_num int, -- 当前页数
@page_max int, -- 每页显示条数
@table varchar(50), -- 表名
@id varchar(20), -- ID字段
@shows varchar(800), -- 显示列
@sort varchar(20), -- 排序字段(推荐用ID)
@where varchar(800), -- 查询条件不推荐用like '%..'
@order varchar(20), -- 排序方式
@record_count int OUTPUT -- 记录总数
)
AS

DECLARE @sql nvarchar(4000), @t_where varchar(800), @t_order varchar(50),
@page_count float, @mod int, @top int

IF @page_num Is Null Or @page_num < 1
SET @page_num = 1

IF @shows Is Null Or LTrim(RTrim(@where)) = ''
SET @shows = '*'

IF @where Is Null Or LTrim(RTrim(@where)) = '' -- 设置条件
SET @t_where = ''
ELSE
SET @t_where = ' WHERE ' + LTrim(RTrim(@where))

If @order = 'DESC' -- 设置排序
SET @t_order = 'ASC'
Else
SET @t_order = 'DESC'

SET @sql = 'SELECT @record_count = COUNT(*) FROM ' + @table + @t_where

EXEC sp_executesql @sql, N'@record_count int OUTPUT', @record_count OUTPUT -- 返回记录总数

SET @page_count = @record_count / @page_max
SET @mod = @record_count - CAst(@page_count As int) * @page_max
SET @page_count = CAst(@page_count As int) + @mod / @mod

IF @page_count > @page_num Or @mod = 0 -- 设置显示页数
SET @top = @page_max
ELSE
SET @top = @mod

SET @sql = 'SELECT temp.' + @id + ', data.' + Replace(@shows, ',', ', data.') + ' FROM (' +
'SELECT TOP ' + CAst(@top As varchar) + ' * FROM (' +
'SELECT TOP ' + CAst(@page_num * @page_max As varchar) + ' ' + @id +
' FROM ' + @table + @t_where + ' ORDER BY ' + @sort + ' ' + @order +
' As temp ORDER BY ' + @sort + ' ' + @t_order + ') As temp' +
' INNER JOIN' + @table + ' As data ON temp.' + @id + ' = data.' + @id +
' ORDER BY temp.' + @id + ' ' + @order
EXEC(@sql)
...全文
259 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
muxrwc 2007-08-07
  • 打赏
  • 举报
回复
只要把那个EXEC(@sql)注释掉。。就可以显示出wc.Parameters("@record_count").Value
muxrwc 2007-08-07
  • 打赏
  • 举报
回复
Dim wc, conn, rs

Set conn = Server.CreateObject("Adodb.Connection")
conn.ConnectionString = "Provider=SQLOLEDB.1;Data Source=(local);User ID=sa;Password=;Database=KC"
conn.Open

Set wc = Server.CreateObject("Adodb.Command")

wc.ActiveConnection = conn
wc.CommandTimeout = 1200
wc.CommandText = "cpage"
wc.CommandType = 4

wc.Parameters.Append wc.CreateParameter("@page_num", 3, 1, 8, 1)
wc.Parameters.Append wc.CreateParameter("@page_max", 3, 1, 4, 15)
wc.Parameters.Append wc.CreateParameter("@table", 200, 1, 50, "[KC].[dbo].[kucun]")
wc.Parameters.Append wc.CreateParameter("@id", 200, 1, 20, "id")
wc.Parameters.Append wc.CreateParameter("@shows", 200, 1, 800, "*")
wc.Parameters.Append wc.CreateParameter("@sort", 200, 1, 20, "id")
wc.Parameters.Append wc.CreateParameter("@where", 200, 1, 800, "")
wc.Parameters.Append wc.CreateParameter("@order", 200, 1, 20, "DESC")
wc.Parameters.Append wc.CreateParameter("@record_count", 3, 2)
'wc.Parameters.Append wc.CreateParameter("@page_count", 3, 2)
Set rs = wc.Execute

Response.Write wc.Parameters("@record_count").Value
muxrwc 2007-08-07
  • 打赏
  • 举报
回复
代码是这样的。。。
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER PROCEDURE [dbo].[cpage] (
@page_num int, -- 当前页数
@page_max int, -- 每页显示条数
@table varchar(50), -- 表名
@id varchar(20), -- ID字段
@shows varchar(800), -- 显示列
@sort varchar(20), -- 排序字段(推荐用ID)
@where varchar(800), -- 查询条件不推荐用like '%..'
@order varchar(20), -- 排序方式
@record_count int OUTPUT -- 记录总数
)
AS

DECLARE @sql nvarchar(4000), @t_where varchar(800), @t_order varchar(50),
@page_count float, @mod int, @top int

IF @page_num Is Null Or @page_num < 1
SET @page_num = 1

IF @where Is Null Or LTrim(RTrim(@where)) = '' -- 设置条件
SET @t_where = ''
ELSE
SET @t_where = ' WHERE ' + LTrim(RTrim(@where))

IF @order = 'DESC' -- 设置排序
SET @t_order = 'ASC'
Else
SET @t_order = 'DESC'

SET @sql = 'SELECT @record_count = COUNT(*) FROM ' + @table + @t_where

EXEC sp_executesql @sql, N'@record_count int OUTPUT', @record_count OUTPUT -- 返回记录总数

SET @page_count = @record_count / @page_max
SET @mod = @record_count - CAst(@page_count As int) * @page_max
SET @page_count = CEiling(@page_count)

IF @page_count > @page_num Or @mod = 0 -- 设置显示页数
SET @top = @page_max
ELSE
SET @top = @mod

SET @sql = 'SELECT temp.' + @id + ', data.' + Replace(@shows, ',', ', data.') + ' FROM (' +
'SELECT TOP ' + CAst(@top As varchar) + ' * FROM (' +
'SELECT TOP ' + CAst(@page_num * @page_max As varchar) + ' ' + @id +
' FROM ' + @table + @t_where + ' ORDER BY ' + @sort + ' ' + @order +
') As temp ORDER BY ' + @sort + ' ' + @t_order + ') As temp' +
' INNER JOIN' + @table + ' As data ON temp.' + @id + ' = data.' + @id +
' ORDER BY temp.' + @id + ' ' + @order
EXEC(@sql)
paoluo 2007-08-07
  • 打赏
  • 举报
回复
你應該在程序中將這個參數定義為output類型。
muxrwc 2007-08-07
  • 打赏
  • 举报
回复
谢谢。。。不过还有一个问题。。
就是EXEC(@sql)后。。
那个@record_count就不能从外面访问了。。怎么才能重新在把它输出出来??
paoluo 2007-08-07
  • 打赏
  • 举报
回复
另外,@where varchar(800)也沒有給值
paoluo 2007-08-07
  • 打赏
  • 举报
回复
muxrwc(需时越兔) ( ) 信誉:100 2007-08-07 13:52:32 得分: 0


过程或函数 'cpage' 需要参数 '@order',但未提供该参数。
它显示这个错误。。。



Dim wc, conn, rs

Set conn = Server.CreateObject("Adodb.Connection")
conn.ConnectionString = "Provider=SQLOLEDB.1;Data Source=(local);User ID=sa;Password=;Database=KC"
conn.Open

Set wc = Server.CreateObject("Adodb.Command")

wc.ActiveConnection = conn
wc.CommandTimeout = 1200
wc.CommandText = "cpage"
wc.CommandType = 4

wc.Parameters.Append wc.CreateParameter("@page_num", 3, 1, 8, 1)
wc.Parameters.Append wc.CreateParameter("@page_max", 3, 1, 4, 15)
wc.Parameters.Append wc.CreateParameter("@table", 200, 1, 50, "[KC].[dbo].[kucun]")
wc.Parameters.Append wc.CreateParameter("@id", 200, 1, 20, "id")
wc.Parameters.Append wc.CreateParameter("@sort", 200, 1, 20, "id")
wc.Parameters.Append wc.CreateParameter("@order", 200, 1, 20, "DESC")
wc.Parameters.Append wc.CreateParameter("@record_count", 3, 2)
Set rs = wc.Execute

这样调用的我。。。


-----------------------

有個參數沒有給值

@shows varchar(800),

muxrwc 2007-08-07
  • 打赏
  • 举报
回复
从查询分析器里没问题。。。
已经解决了。谢谢你了。。。
ORARichard 2007-08-07
  • 打赏
  • 举报
回复
把 你 的 存 储 过 程 先 放 在 查 询 分 析 器 中 运 行. 看 看 有 什 么 问 题
muxrwc 2007-08-07
  • 打赏
  • 举报
回复
过程或函数 'cpage' 需要参数 '@order',但未提供该参数。
它显示这个错误。。。



Dim wc, conn, rs

Set conn = Server.CreateObject("Adodb.Connection")
conn.ConnectionString = "Provider=SQLOLEDB.1;Data Source=(local);User ID=sa;Password=;Database=KC"
conn.Open

Set wc = Server.CreateObject("Adodb.Command")

wc.ActiveConnection = conn
wc.CommandTimeout = 1200
wc.CommandText = "cpage"
wc.CommandType = 4

wc.Parameters.Append wc.CreateParameter("@page_num", 3, 1, 8, 1)
wc.Parameters.Append wc.CreateParameter("@page_max", 3, 1, 4, 15)
wc.Parameters.Append wc.CreateParameter("@table", 200, 1, 50, "[KC].[dbo].[kucun]")
wc.Parameters.Append wc.CreateParameter("@id", 200, 1, 20, "id")
wc.Parameters.Append wc.CreateParameter("@sort", 200, 1, 20, "id")
wc.Parameters.Append wc.CreateParameter("@order", 200, 1, 20, "DESC")
wc.Parameters.Append wc.CreateParameter("@record_count", 3, 2)
Set rs = wc.Execute

这样调用的我。。。
muxrwc 2007-08-07
  • 打赏
  • 举报
回复
换啦。。可是看不出。。。,貌似没有执行到那里就已经出错了。。。
muxrwc 2007-08-07
  • 打赏
  • 举报
回复
好。。谢谢。。我去看下。。
ORARichard 2007-08-07
  • 打赏
  • 举报
回复
把EXEC(@sql)改为print(@sql)就 能看出问题了

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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