take - ssma sql server download




Como implementar o LIMIT com o Microsoft SQL Server? (10)

Eu tenho essa consulta com o mysql:

select * from table1 LIMIT 10,20

Como posso fazer isso com o Microsoft sql?


É assim que eu limite os resultados no MS SQL Server 2012

SELECT * 
FROM table1
ORDER BY columnName
  OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

NOTA: OFFSET só pode ser usado com ou em conjunto com ORDER BY.

Para explicar a linha de código OFFSET xx ROWS FETCH PRÓXIMO YY ROW ONLY

O "xx" é o número do registro / linha que você quer começar a puxar na tabela.
IE: Se houver 40 registros na tabela 1. O código acima começará a ser puxado da linha 10.

O "yy" é o número de registros / linhas que você deseja extrair da tabela.
Para construir no exemplo anterior.
IE: Se a tabela 1 tiver 40 registros e você começar a puxar da linha 10 e pegar o próximo conjunto de 10 (yy).
Isso significaria que o código acima puxará os registros da tabela 1, começando na linha 10 e terminando em 20. Assim, puxando as linhas 10 - 20.

Confira o link para mais informações sobre OFFSET


A partir do SQL SERVER 2012, você pode usar a cláusula OFFSET FETCH:

USE AdventureWorks;
GO
SELECT SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader 
ORDER BY SalesOrderID
    OFFSET 10 ROWS
    FETCH NEXT 10 ROWS ONLY;
GO

http://msdn.microsoft.com/en-us/library/ms188385(v=sql.110).aspx

Isso pode não funcionar corretamente quando a ordem não é exclusiva.

Se a consulta for modificada para ORDER BY OrderDate, o conjunto de resultados retornado não será o esperado.


Deve tentar. Na consulta abaixo, você pode ver Agrupar por, ordenar por, Ignorar linhas e limitar linhas.

select emp_no , sum(salary_amount) from emp_salary
Group by emp_no 
ORDER BY emp_no 
OFFSET 5 ROWS       -- Skip first 5 
FETCH NEXT 10 ROWS ONLY; -- limit to retrieve next 10 row after skiping rows

Esta é uma abordagem de várias etapas que funcionará no SQL2000.

-- Create a temp table to hold the data
CREATE TABLE #foo(rowID int identity(1, 1), myOtherColumns)

INSERT INTO #foo (myColumns) SELECT myData order By MyCriteria

Select * FROM #foo where rowID > 10

Iniciando o SQL SERVER 2005, você pode fazer isso ...

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 10 AND 20;

ou algo assim para 2000 e versões abaixo ...

SELECT TOP 10 * FROM (SELECT TOP 20 FROM Table ORDER BY Id) ORDER BY Id DESC

Isso é quase uma duplicata de uma pergunta que fiz em outubro: Emular a cláusula MySQL LIMIT no Microsoft SQL Server 2000

Se você estiver usando o Microsoft SQL Server 2000, não há uma boa solução. A maioria das pessoas precisa recorrer à captura do resultado da consulta em uma tabela temporária com uma chave primária IDENTITY . Em seguida, consulte a coluna de chave primária usando uma condição BETWEEN .

Se você estiver usando o Microsoft SQL Server 2005 ou posterior, você tem uma função ROW_NUMBER() , portanto, você pode obter o mesmo resultado, mas evitar a tabela temporária.

SELECT t1.*
FROM (
    SELECT ROW_NUMBER OVER(ORDER BY id) AS row, t1.*
    FROM ( ...original SQL query... ) t1
) t2
WHERE t2.row BETWEEN @offset+1 AND @offset[email protected]count;

Você também pode escrever isso como uma expressão de tabela comum, como mostrado na answer @Leon Tayson.


Se bem me lembro (já faz um tempo desde que eu usei o SQL Server) você pode usar algo assim: (2005 e acima)

SELECT
    *
   ,ROW_NUMBER() OVER(ORDER BY SomeFields) AS [RowNum]
FROM SomeTable
WHERE RowNum BETWEEN 10 AND 20

Se o seu ID é um tipo de identificador único ou o seu id na tabela não está classificado, você deve fazer o seguinte abaixo.

select * from
(select ROW_NUMBER() OVER (ORDER BY (select 0)) AS RowNumber,* from table1) a
where a.RowNumber between 2 and 5



O código será

select * from limit 2,5

SELECT 
    * 
FROM 
    (
        SELECT 
            top 20              -- ($a) number of records to show
            * 
        FROM
            (
                SELECT 
                    top 29      -- ($b) last record position
                    * 
                FROM 
                    table       -- replace this for table name (i.e. "Customer")
                ORDER BY 
                    2 ASC
            ) AS tbl1 
        ORDER BY 
            2 DESC
    ) AS tbl2 
ORDER BY 
    2 ASC;

-- Examples:

-- Show 5 records from position 5:
-- $a = 5;
-- $b = (5 + 5) - 1
-- $b = 9;

-- Show 10 records from position 4:
-- $a = 10;
-- $b = (10 + 4) - 1
-- $b = 13;

-- To calculate $b:
-- $b = ($a + position) - 1

-- For the present exercise we need to:
-- Show 20 records from position 10:
-- $a = 20;
-- $b = (20 + 10) - 1
-- $b = 29;

SELECT  *
FROM    (
        SELECT  TOP 20
                t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
        FROM    table1 t
        ORDER BY
                field1
        ) t
WHERE   rn > 10




migration