日期:2014-05-18  浏览次数:20380 次

存储过程里能不能用top 请看
CREATE   PROCEDURE   Pr_Sel
(
        @Num   int
)
AS
BEGIN
      select   top   @Num  
END
这样写好像不可以,应该怎么写?

------解决方案--------------------
top @Num

--------------------
Top语句后面是一个常数,而不能是一个变量!
------解决方案--------------------
可,see
CREATE PROCEDURE Coffeefox_Paging
(
@tblName varchar(50) , ------ 表名
@strGetFields varchar(500)= ' * ' , ------ 需要返回的列
@fldName varchar(50)= ' ' , ------ 排序的字段名
@PageSize int = 15, ------ 页尺寸
@PageIndex int=1 , ------ 页码
@OrderType bit = 1, ------ 设置排序类型, 0升序,1为降序
@strWhere varchar(1500) = ' ' ------ 查询条件 (注意: 不要加 where)
)
AS

declare @strSQL varchar(5000) ------ 主语句
declare @strOrder varchar(300) ------ 排序类型

if @fldName!= ' '
begin
if @OrderType != 0 -----如果@OrderType不是0,就按降序排列
begin
set @strOrder = ' order by [ ' + @fldName + '] desc '
end
else-----@OrderType为0,按升序排列
begin
set @strOrder = ' order by [ ' + @fldName + '] asc '
end
end
else
begin
set @strOrder = ' '
end
begin
if @PageIndex = 1 ------如果指定为第一页
begin
if @strWhere != ' '
set @strSQL = 'select top ' + str(@PageSize) + ' '+@strGetFields+ ' from [ ' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) + ' '+@strGetFields+ ' from [ '+ @tblName + '] '+ @strOrder
end
else------不为第一页
begin
if @strWhere != ' '
set @strSQL = 'select top ' + str(@PageSize) + ' '+@strGetFields+ ' from [ ' + @tblName + '] where [ ' + @fldName + '] not in (select top ' + str((@PageIndex-1)*@PageSize) + ' [ '
+ @fldName + '] from [ ' + @tblName + '] where ' + @strWhere + ' ' + @strOrder + ') and ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) + ' '+@strGetFields+ ' from [ ' + @tblName + '] where [ ' + @fldName + '] not in (select top ' + str((@PageIndex-1)*@PageSize) + ' [ '
+ @fldName + '] from [ ' + @tblName + '] ' + @strOrder + ') ' + @strOrder
end
end
exec (@strSQL)
GO

------解决方案--------------------
动态执行Sql语句!!!

在存储过程中能不用动态执行就不用!

------解决方案--------------------
SET ROWCOUNT @Num

------解决方案--------------------
可以使用,代码如下;
create proc sel_jobs
@Num int
as
DECLARE @strSql nvarchar(2000)
set @strSql = 'select top ' + str(@Num) + 'from jobs '
exec (@strSql)