从存储过程中获取前N个

时间:2012-07-13 13:22:43

标签: tsql stored-procedures sql-server-2008-r2 subquery sql-function

我有一个无法修改的存储过程,在任何人建议我重新编写存储过程或将存储过程内的查询添加到函数中之前,我将强调这一点。

该程序存在于另一个我们访问权限非常有限的数据库中;所以我想做的是以某种方式将存储过程包装在查询功能存储过程中,这样我就可以选择来自返回数据的前N行

理想情况下,我可以打电话给......

DECLARE @ForeName varchar(50)
DECLARE @Surname varchar(50)
DECLARE @DOB datetime
DECLARE @Sex varchar(1)

SET @Surname = 'Smith'

SELECT TOP 10 (
   EXECUTE @RC = [Some_Other_Database].[dbo].[sp_search_demographics] 
     ,@ForeName
     ,@Surname
     ,@DOB
     ,@Sex
)
GO

编辑:(我还应该注意,存储过程返回一个包含行数和行的参数)

edit2:我还应该注意到我正在使用MS SQL Server 2008 R2

我知道这不是正确的,有没有办法做这样的事情?目前,对于模糊的查询,我们收到了数千行;这大大减慢了服务器的负担。

我已经完成了一些谷歌搜索和堆栈溢出的解决方案,但遗憾的是我能找到的所有建议都涉及修改存储过程。

2 个答案:

答案 0 :(得分:3)

查找EXEC SP_EXECUTESQL(@SQL) 但问题是被调用的sp仍将返回所有行,因此您可能无法获得所需的性能提升。 您还可以设置查询返回的行数 - 但取决于您的访问级别 http://blog.sqlauthority.com/2007/04/30/sql-server-set-rowcount-retrieving-or-limiting-the-first-n-records-from-a-sql-query/ 希望这有帮助

答案 1 :(得分:0)

Declare @i  Numeric(18,2)
Declare @strSQL nvarchar(1000)
select @i = Round(COUNT(1)/10,2) from tb_Item
print(@i)
Declare @j int = 0

Declare @rem numeric(18,2)
select @rem = COUNT(1) - ((COUNT(1)/10) * 10) from tb_Item 

while @i > 0
Begin
    set @j = (@j + 1);

    if @j = 1
    Begin
        WITH OrderedOrders AS
        (
            select 
                ROW_NUMBER() over(order by ItemID) AS RowNumber
                ,ItemName
            from tb_Item 
        ) 
        SELECT ItemName, RowNumber  
        FROM OrderedOrders 
        WHERE RowNumber BETWEEN (@j*10)-10 AND @j*10;
    End
    Else
    Begin
        WITH OrderedOrders AS
        (
            select 
                ROW_NUMBER() over(order by ItemID) AS RowNumber
                ,ItemName
            from tb_Item 
        ) 
        SELECT ItemName, RowNumber  
        FROM OrderedOrders 
        WHERE RowNumber BETWEEN ((@j*10)-10) + 1 AND @j*10;
    End 
    set @i = @i - 1;
end;

WITH OrderedOrders AS
(
    select 
        ROW_NUMBER() over(order by ItemID) AS RowNumber
        ,ItemName  
    from tb_Item 
) 
SELECT ItemName, RowNumber  
FROM OrderedOrders 
WHERE RowNumber BETWEEN (@j*10)+1 and (@j*10) + @rem ;