高分求教SQL存储过程..

星火燎猿 2009-08-29 07:10:44
如今面临如下问题:

存储过程如下:

create proc sp_GetTopThing
@count int,
@size int

as

select top @size * from message where id not in(select top @count id from message order by(id) desc) order by(id) desc


当执行的时候会出问题,该怎么解决啊..

也就是 @size就是我们的查询的前N条数据,@count表示已经查询过的message表中的数据...



解决此问题者给高分.....越详细越好...
...全文
280 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
victorcai2006 2009-09-01
  • 打赏
  • 举报
回复
在这里LZ需要注意的是,如果在生成SQL语句中需要使用到 ’标识符的如下面的语句:

DECLARE @SQL varchar(8000)

DECLARE @size int
DECLARE @count int
DECLARE @TEST VARCHAR(100)

SET @size=6
SET @count=10
SET @TEST='TEST'

SET @SQL='select top '+CAST(@size AS varchar(10))+' * from message where id not in(select top '
+CAST(@count AS varchar(10))+' id from message WHERE NAME='''+@TEST+''' order by(id) desc) order by(id) desc'

PRINT @SQL

/*执行结果:
select top 6 * from message where id not in(select top 10 id from message WHERE NAME='TEST' order by(id) desc) order by(id) desc

注意这里,语句中是这样写的:WHERE NAME='''+@TEST+'''
而执行的结果是:WHERE NAME='TEST'

在 'WHERE …………'字符串中要显示一个 '
必须写成 '',如果只有一个',结果就是错误的

*/

至于这个语句中所使用到的PRINT和EXEC,楼主可以看看联机丛书,里面有详细的描述

*********************************
PRINT
将用户定义的消息返回客户端。

语法
PRINT 'any ASCII text' | @local_variable | @@FUNCTION | string_expr

参数
'any ASCII text'

一个文本字符串。

@local_variable

任意有效的字符数据类型变量。@local_variable 必须是 char 或 varchar,或者能够隐式转换为这些数据类型。

@@FUNCTION

是返回字符串结果的函数。@@FUNCTION 必须是 char 或 varchar,或者能够隐式转换为这些数据类型。

string_expr

是返回字符串的表达式。可包含串联的字面值和变量。消息字符串最长可达 8,000 个字符,超过 8,000 个的任何字符均被截断。

注释
若要打印用户定义的错误信息(该消息中包含可由 @@ERROR 返回的错误号),请使用 RAISERROR 而不要使用 PRINT。

示例
A. 有条件地执行打印 (IF EXISTS)
本示例使用 PRINT 语句有条件地返回消息。

IF EXISTS (SELECT zip FROM authors WHERE zip = '94705')
PRINT 'Berkeley author'

B. 生成并显示字符串
本示例将 GETDATE 函数的结果转换为 varchar 数据类型,并将其与 PRINT 要返回的文本进行串联。

PRINT 'This message was printed on ' +
RTRIM(CONVERT(varchar(30), GETDATE())) + '.'

*********************************

EXECUTE
执行标量值的用户定义函数、系统过程、用户定义存储过程或扩展存储过程。同时支持 Transact-SQL 批处理内的字符串的执行

若要唤醒调用函数,请使用 EXECUTE stored_procedure 中描述的语法。

语法
执行存储过程:

[ [ EXEC [ UTE ] ]
{
[ @return_status = ]
{ procedure_name [ ;number ] | @procedure_name_var
}
[ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ]
[ ,...n ]
[ WITH RECOMPILE ]

执行字符串:

EXEC [ UTE ] ( { @string_variable | [ N ] 'tsql_string' } [ + ...n ] )

参数
@return_status

是一个可选的整型变量,保存存储过程的返回状态。这个变量在用于 EXECUTE 语句前,必须在批处理、存储过程或函数中声明过。

*********************************
victorcai2006 2009-09-01
  • 打赏
  • 举报
回复
--最后再将上面的语句放置到存储过程中
CREATE PROC sp_GetTopThing
@count INT,@size INT
AS
BEGION
DECLARE @SQL varchar(8000)

SET @SQL='select top '+CAST(@size AS varchar(10))+' * from message where id not in(select top '
+CAST(@count AS varchar(10))+' id from message order by(id) desc) order by(id) desc'

EXEC (@SQL)
END
victorcai2006 2009-09-01
  • 打赏
  • 举报
回复

/*---------------------------------------
瘦狼阿亮 | 钱不是问题,问题是没钱!

我乐于享受学习的过程
---------------------------------------*/

DECLARE @SQL varchar(8000)

--测试环境中声明一下@size和@count变量
DECLARE @size int
DECLARE @count int

--设置参数变量值
SET @size=6
SET @count=10

--用连接字符串的方式生成SQL语句,并将SQL语句放置到@SQL变量中
SET @SQL='select top '+CAST(@size AS varchar(10))+' * from message where id not in(select top '
+CAST(@count AS varchar(10))+' id from message order by(id) desc) order by(id) desc'

--为保证语句能够正常运行,首先先打印出生成的SQL语句,用于验证是否符合要求
PRINT (@SQL)

/*执行结果:
以下是生成的语句
select top 6 * from message where id not in(select top 10 id from message order by(id) desc) order by(id) desc
*/

--执行生成的SQL语句(如果经过检查SQL语句没有问题,就可以把上面的print (@sql)注释掉,直接执行查询即可)
--EXEC (@SQL)
xupeihuagudulei 2009-09-01
  • 打赏
  • 举报
回复
晚上扫帖
jeansy911 2009-08-31
  • 打赏
  • 举报
回复

2000不支持TOP带变量吧。。。
ADVANTECH_CYZ 2009-08-31
  • 打赏
  • 举报
回复
这是不是传说中的存储过程实现分页??
tengjian1981 2009-08-31
  • 打赏
  • 举报
回复
sql2005的top支持用变量,sql2000不支持,只能拼字符串用exec执行
cxmcxm 2009-08-31
  • 打赏
  • 举报
回复
--使用动态sql

create proc sp_GetTopThing
@count int,
@size int

as
declare @sql varchar(200)

@sql='select top '+convert(varchar(20),@size)+' * from message where id not in(select top '+convert(varchar(20),@count)+' id from message order by(id) desc) order by(id) desc '
exec(@sql)
yinmib128 2009-08-31
  • 打赏
  • 举报
回复
学习
Lyohn 2009-08-31
  • 打赏
  • 举报
回复
高手很多!
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jinjazz 的回复:]
SQL codecreateproc sp_GetTopThing@countint,@sizeintasbegindeclare@sqlvarchar(8000)set@sql='
select top'+ltrim(@size)+' * from message where id not in(select top'+ltrim(@count)+' id from message order¡­
[/Quote]
楼主正解
cailee 2009-08-31
  • 打赏
  • 举报
回复
create procedure sp_GetTopThing
(
@count int,
@size int
)
as
begin
declare @sql varchar(8000)
set @sql='select top '+cast(@size as varchar(20))+' * from message '
set @sql=' where [id] not in (select top '+cast(@count as varchar(20))+' [id] from message order by([id]) desc) order by(id) desc'

exec(@sql)
end
devilidea 2009-08-31
  • 打赏
  • 举报
回复
学习
q85958341 2009-08-31
  • 打赏
  • 举报
回复
恭喜楼主问题得到解决!学习了~
victorcai2006 2009-08-31
  • 打赏
  • 举报
回复
先MARK,然后自己写一下把过程发上来
wujinjian2008n 2009-08-31
  • 打赏
  • 举报
回复
create proc sp_GetTopThing
@count int,
@size int

as

select top (@size) * from message where id not in(select top (@count) id from message order by(id) desc) order by(id) desc

加上括号就可以了了
wolfmvp 2009-08-31
  • 打赏
  • 举报
回复
这个问题的解决办法,就是用来查询数据量比较大的表中,中间数据的方法,解法真多…
sp4 2009-08-31
  • 打赏
  • 举报
回复
2005支持1楼的
2000的话就用2楼的
aoxuesuqian 2009-08-30
  • 打赏
  • 举报
回复
create proc sp_GetTopThing
@count int,
@size int
as

declare @sql varchar(8000)

set @sql='select top '+ltrim(@size)+' * from message where id not in(select top '+ltrim(@count)+' id from message order by(id) desc) order by(id) desc'

exec (@sql)

go
W3CLEAGUEMEMBER 2009-08-30
  • 打赏
  • 举报
回复
这个得用动态语句吧。
create proc sp_GetTopThing
@count int,
@size int

as
begin
declare @sql varchar(8000)
set @sql='
select top '+ltrim(@size)+' * from message where id not in(select top '
+ltrim(@count)+' id from message order by(id) desc) order by(id) desc'
exec (@sql)
end
加载更多回复(17)

34,590

社区成员

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

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