限制服务器端返回的行数(强制限制)

时间:2010-05-20 13:32:16

标签: sql-server sql-server-2008 client-server

所以我们有一个软件,它的SQL语句编写得很糟糕,导致表中的每一行都被返回。表中有几百万行,因此这会导致严重的内存问题和客户端计算机崩溃。供应商正在为该问题创建补丁,但仍需要几周时间。与此同时,我们试图找出一种限制服务器端返回结果数量的方法,只是作为临时修复。

我没有真正的希望有一个解决方案,我环顾四周,并没有真正看到任何方法这样做,但我希望有人可能有一个想法。

提前谢谢。

修改

我忘记了一条重要的信息,我们无法访问源代码,因此我们无法在形成SQL语句的客户端更改此信息。没有真正的服务器端组件,客户端只是直接访问数据库。任何解决方案基本上都需要一个过程,触发器或某种SQL-Server 2008设置/命令。

5 个答案:

答案 0 :(得分:2)

一种可能的解决方案可能是

  • 重命名违规表格
  • 使用原始表名
  • 创建updatable view
  • 执行SELECT TOP x * FROM OffendingTable视图定义

因此,客户端在选择数据时不知道更改。


使用query governor

如果您不介意根本不为有问题的查询返回任何数据,则查询调控器允许您这样做。

答案 1 :(得分:1)

必须有一个命令。

我知道在MYSQL中,在sql语句的末尾是“LIMIT(firstindex,lastindex)”。

我想我在MSSQL中听说过你可以写:

选择TOP 10,20 ......或类似的东西

这意味着你选择20行,其中10开始我认为

答案 2 :(得分:1)

你可以使用select top

从人群中选择前50%*(http://www.w3schools.com/sql/sql_top.asp

像这样的分页会帮助你吗

CREATE PROCEDURE [dbo].[GetRequestedRecordByPage] 
 @FromList nvarchar(200)              -- Table Name  
,@SortingCol nvarchar(200)         -- Sorting column Name
,@SelectList nvarchar(200) = '*'         -- Select columns list
,@WhereClause nvarchar(200) = ''        -- Where clause i.e condition
,@PageNum int = 1                           -- Requested page number
,@PageSize int = 5                 -- No of record in page
,@TotalNoOfRecord int output         -- Total no of selected records
AS 
Begin
  SET NOCOUNT ON 
  DECLARE @Query nvarchar(max)         -- query going to be execute

  IF rtrim(ltrim(@WhereClause)) <> '' 
  BEGIN
      SET @Query ='SELECT   @TotalNoOfRecord = COUNT(*) 
                      FROM     ' + @FromList + ' 
        WHERE    ' + @WhereClause 
  END
  ELSE 
  BEGIN 
      SET @Query ='SELECT   @TotalNoOfRecord = COUNT(*) 
                      FROM     ' + @FromList 
  END

    /* Count no. of record */
       EXEC sp_executeSQL 
        @Query, 
        @params = N'@TotalNoOfRecord INT OUTPUT', 
         = @TotalNoOfRecord OUTPUT 

DECLARE @lbound int, @ubound int 




/* Calculating upper and lower bound */
        SET @lbound = ((@PageNum - 1) * @PageSize) 
        SET @ubound = @lbound + @PageSize + 1 


/* Get list of record(s) */
        SELECT @Query =  ''
        SELECT @Query =  'SELECT  * 
                          FROM    ( 
SELECT  ROW_NUMBER() OVER(ORDER BY ' + @SortingCol  + ') AS rownumber,' +@SelectList  +   
                                        ' FROM    ' + @FromList 

        IF rtrim(ltrim(@WhereClause)) <> '' 
        BEGIN
            SELECT @Query = @Query + ' WHERE   ' + @WhereClause 
        END

            SELECT @Query = @Query + '     ) AS tbl 
WHERE rownumber > ' + CONVERT(varchar(9), @lbound) + 
      ' AND rownumber < ' + CONVERT(varchar(9), @ubound) 

       EXEC (@Query)                 
End

答案 3 :(得分:1)

如果客户端使用TCP连接到数据库,则可以在服务器端的客户端和数据库服务器之间插入大部分透明的TCP代理服务器。然后,您可以重写来自客户端的任何有问题的查询(使用TOP或某些改进查询的方法)。

然后,将SQL Server配置为在其他端口上运行,启动代理以在原始端口上提供服务,并使其连接到新端口上的SQL Server。如果您知道客户端的原始IP地址,则可以使用端口转发,以便可以将它们直接指向代理,并保持数据库服务器配置为原样。

我可以在一小时内编写并测试它,但它确实需要一些socket编程知识。

答案 4 :(得分:0)

你可以从表中删除除X记录以外的所有记录并将它们存储在其他地方