2

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

该程序位于另一个我们访问权限非常有限的数据库上;所以我想做的是以某种方式将存储过程包装在一个查询函数存储过程中,这将允许我从返回的数据中选择前 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

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

编辑2:我还应该注意我正在使用 MS SQL Server 2008 R2

我知道这绝不是正确的,有没有办法做这样的事情?目前,对于模糊查询,我们返回了数千行;这大大降低了服务器的速度。

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

4

2 回答 2

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/ 希望这会有所帮助

于 2012-07-13T13:31:54.773 回答
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 ;
于 2015-01-27T05:28:55.457 回答