Конференция "Базы" » SKIP записей при селективном запросе [D6, MSSQL]
 
  • piople © (21.04.08 08:25) [0]
    Здравстуйте! Использую ADO + MSSQL 2005. Сталкнулся с проблемой - необходимо выбрать записи из таблицы, но при этому пропустить несколько первых. То есть, есть ISAPI гостевой книги, соответственно с переходами по страницам. И конечно не хочется тянуть из БД все записи, пролистывать их в цикле программы и выводить нужные. Есть ли возможность программно на через селективный запрос запросить записи начиная с 40 по 50?

    З.Ы. Наткунлся на http://msdn2.microsoft.com/en-us/library/bb738680.aspx


    You can perform physical paging by using the SKIP sub-clause in the ORDER BY clause. SKIP cannot be used separately from the ORDER BY clause.

    Syntax

    [ SKIP (n) ]
    Arguments
    n
    The number of items to skip.

    Remarks
    If a SKIP expression sub-clause is present in an ORDER BY clause, the results will be sorted according the sort specification and the result set will include rows starting from the next row immediately after the SKIP expression. For example, SKIP 5 will skip the first five rows and return from the sixth row forward.

    Note  
    An Entity SQL query is invalid if both the TOP modifier and the SKIP sub-clause are present in the same query expression. The query should be rewritten by changing the TOP expression to the LIMIT expression.

    Note  
    In SQL Server 2000, using SKIP with ORDER BY on non-key columns might return incorrect results. More than the specified number of rows might be skipped if the non-key column has duplicate data in it. This is due to how SKIP is translated for SQL Server 2000. For example, in the following code more than five rows might be skipped if E.NonKeyColumn has duplicate values:
    SELECT [E] FROM Container.EntitySet AS [E] ORDER BY [E].[NonKeyColumn] DESC SKIP 5L

    Example
    The following Entity SQL query uses the ORDER BY operator with SKIP to specify the sort order used on objects returned in a SELECT statement. The query is based on the AdventureWorks Sales Model. To compile and run this query, follow these steps:

    Follow the procedure in How to: Execute an Entity SQL Query Using EntityCommand (Entity Framework).

    Substitute the query string in the sample with the following query:

    Copy Code
    SELECT VALUE e1 FROM AdventureWorksEntities.Product
       AS e1 order by e1.ListPrice SKIP(70)


    Но видемо руки у меня ростут не оттуда )
  • sniknik © (21.04.08 08:44) [1]
    > запросить записи начиная с 40 по 50?
    в 2005 появилась нумерация строк в запросах (RowNum), т.что запрос определенных нумерацией становится очевидным.

    LIMIT это из MySql, также как и этот скопированный кусок хелпа... SKIP не знаю, не пользовался, но судя по тому что он в том же тексте с LIMIT...
  • piople © (21.04.08 09:41) [2]
    Спасибо, видемо все же придется делать так:
    SELECT     *
    FROM         (SELECT     TOP (20) ROW_NUMBER() OVER (ORDER BY TDate) AS TmpR, *
    FROM         SiteGuestBook) TmpR1
    WHERE     TmpR BETWEEN 10 AND 20



    Жаль что нет аналога SKIP & LIMIT...
  • Anatoly Podgoretsky © (21.04.08 11:44) [3]

    > LIMIT это из MySql, также как и этот скопированный кусок
    > хелпа... SKIP не знаю, не пользовался, но судя по тому что
    > он в том же тексте с LIMIT...

    Это не MySQL, Entity SQL, часть ADO.NET
  • Anatoly Podgoretsky © (21.04.08 11:47) [4]

    > Жаль что нет аналога SKIP & LIMIT...

    Как это нет, а это что?

    SELECT c.ContactID as ID, c.LastName as Name FROM
       AdventureWorks.Contact AS c ORDER BY c.ContactID SKIP 9 LIMIT 3;

  • sniknik © (21.04.08 12:00) [5]
    > Это не MySQL, Entity SQL, часть ADO.NET
    ясно, но для меня бесполезно, ADO на запросе из [4] дает "Incorrect syntax near 'SKIP'"
  • sniknik © (21.04.08 12:04) [6]
    кстати непонятно почему... или ADO.NET сам выполняет/преобразовывает запросы? по идее то должен передать в MSSQL и получить результат также как ADO, и тогда синтаксис их запросов (ADO/ADO.NET) должен быть одинаков, и зависеть только от поддержки данного синтаксиса MSSQL-ем.
  • Anatoly Podgoretsky © (21.04.08 14:05) [7]
    > sniknik  (21.04.2008 12:00:05)  [5]

    АДО даст, это должно использоваться только в ADO.NET и при использование Entity SQL
    Широко применяется в ASP.NET или скрыто или явно, для разбиения на страницы.
  • Anatoly Podgoretsky © (21.04.08 14:06) [8]
    > sniknik  (21.04.2008 12:04:06)  [6]

    Ну я уже написал, что это даже не ADO.NET и тем более сервер.
  • piople © (22.04.08 05:14) [9]
    Немного расширю тему если вдруг кому инетересно:

    Entity SQL — новый язык, обеспечивающий исполнение декларативных запросов, ориентированных на наборы, а также обновление сущностей и связей в Entity Data Model. Для Entity SQL практически не важен провайдер данных, поэтому одни и те же запросы можно исполнять через разные провайдеры БД, что экономит время на написание кода.

    Линк - http://64.233.183.104/search?q=cache:1jQmGncXdNkJ:https://msdb.ru/Downloads/sql/2008/SQL2008andDP_rus.doc+%D0%A7%D1%82%D0%BE+%D1%82%D0%B0%D0%BA%D0%BE%D0%B5+Entity+SQL&hl=ru&ct=clnk&cd=3&gl=ru&lr=lang_ru
  • ANB (22.04.08 09:39) [10]

    > Entity SQL — новый язык, обеспечивающий исполнение декларативных
    > запросов, ориентированных на наборы, а также обновление
    > сущностей и связей в Entity Data Model. Для Entity SQL практически
    > не важен провайдер данных, поэтому одни и те же запросы
    > можно исполнять через разные провайдеры БД, что экономит
    > время на написание кода.

    взамен увеличивая время исполнения запроса, т.к. не учитывает особенности диалекта сервера.
 
Конференция "Базы" » SKIP записей при селективном запросе [D6, MSSQL]
Есть новые Нет новых   [134432   +19][b:0][p:0.001]