[待解决问题] 关于存储过程传参数的
提问时间: 2008-03-26 11:57
悬赏分:10 该问题已到期 浏览:255 次

我建了个存储过程

if exists(select * from sysobjects where name='Proc_GetSnm_announcementByTopSize')
 drop proc Proc_GetSnm_announcementByTopSize
go
create proc Proc_GetSnm_announcementByTopSize
 @size int
as
declare  @sql nvarchar(4000)
    if(@size=0)
    begin
  select top (select count(*) from snm_announcement)  snm_announcement.*,snm_user.username
     from snm_announcement,snm_user
     where snm_announcement.uid=snm_user.uid
     order by pubdate desc
    end
    else                                                        select top @size) snm_announcement.*,snm_user.username
     from snm_announcement,snm_user
     where snm_announcement.uid=snm_user.uid
     order by pubdate desc'
    exec sp_executesql @sql
go

老是报错

@size 附近有语法错误

这是怎么回事啊?


提问者:yeyang - 菜鸟二级
所有回答(6)
我记得Select top 好象不能使用参数.
1个月前   回答者:沙加 - 老鸟四级
select top str(@size)

或者select top cast(int,@size)
cast的语法忘记了,楼主自己查一下
1个月前   回答者:WEBBER - 初学一级
对,Select top不能用参数,把语句跟参数加成字符串,然后用EXEC()函数来执行
比如:
CREATE PROCEDURE dbo.getUserName 
@intTop int=15
as
declare @sql varchar(1000)
set @sql = 'select Top  ' @intTop '  * from dbo.[userinfo]'
exec (@sql)
go 

1个月前   回答者:潘奕涛 - 初学一级
最好的办法是使用RowCount:

SET ROWCOUNT @Size; Select * from whatever; SET ROWCOUNT 0;

1个月前   回答者:deerchao - 老鸟四级
应该是create proc Proc_GetSnm_announcementByTopSize
 @size int
as
declare  @sql nvarchar(4000)
    if(@size=0)
    begin 
.....
else
 ..
set @sql='select Top '+CAST(@size AS NVARCHAR)+' * FROM TABLE';

exec (@sql)
go
因为你的@sql是NVARCHAR 所以要把int的@size转化成NVARCHAR再连接到@sql上面;

1个月前   回答者:IamV - 初学一级
else后面接着的select top @size) 
少了一个左半括号,应该为:select top (@size) 
sql2005以后可以用top加参数了
没用过别说不支持,尽量避免使用字符串拼接吧。
1个月前   回答者:风海迷沙 - 菜鸟二级
1个月前   yeyang :
@潘奕涛
我就是用你的这个方法解决的 
好想真的不能直接船参数 

1个月前   yeyang :
@风海迷沙
真是高人啊  你这个更简单
   您需要登录以后才能回答!
我的问题    我要提问


快到期问题

> 问题排行榜

有不合适内容,建议去除