悬赏分: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 附近有语法错误
这是怎么回事啊?
|
我记得Select top 好象不能使用参数. select top str(@size) 或者select top cast(int,@size) cast的语法忘记了,楼主自己查一下 对,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 最好的办法是使用RowCount: SET ROWCOUNT @Size; Select * from whatever; SET ROWCOUNT 0; 应该是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上面; else后面接着的select top @size) 少了一个左半括号,应该为:select top (@size) sql2005以后可以用top加参数了 没用过别说不支持,尽量避免使用字符串拼接吧。 |