yyyy - sql convert string to int



Décalage de ligne dans SQL Server (10)

Est-il possible dans SQL Server d'obtenir les résultats à partir d'un décalage donné? Par exemple, dans un autre type de base de données SQL, il est possible de faire:

SELECT * FROM MyTable OFFSET 50 LIMIT 25

pour obtenir des résultats 51-75. Cette construction ne semble pas exister dans SQL Server.

Comment puis-je accomplir ceci sans charger toutes les lignes dont je me fiche? Merci!


C'est un moyen (SQL2000)

SELECT * FROM
(
    SELECT TOP (@pageSize) * FROM
    (
        SELECT TOP (@pageNumber * @pageSize) *
        FROM tableName 
        ORDER BY columnName ASC
    ) AS t1 
    ORDER BY columnName DESC
) AS t2 
ORDER BY columnName ASC

et c'est une autre façon (SQL 2005)

;WITH results AS (
    SELECT 
        rowNo = ROW_NUMBER() OVER( ORDER BY columnName ASC )
        , *
    FROM tableName 
) 
SELECT * 
FROM results
WHERE rowNo between (@pageNumber-1)*@pageSize+1 and @pageNumber*@pageSize

Dans SqlServer2005, vous pouvez effectuer les opérations suivantes:

DECLARE @Limit INT
DECLARE @Offset INT
SET @Offset = 120000
SET @Limit = 10

SELECT 
    * 
FROM
(
   SELECT 
       row_number() 
   OVER 
      (ORDER BY column) AS rownum, column2, column3, .... columnX
   FROM   
     table
) AS A
WHERE 
 A.rownum BETWEEN (@Offset) AND (@Offset + @Limit-1) 


J'ai recherché cette réponse pendant un moment maintenant (pour des requêtes génériques) et ai découvert une autre manière de le faire sur SQL Server 2000+ en utilisant ROWCOUNT et des curseurs et sans TOP ou n'importe quelle table temporaire.

En utilisant SET ROWCOUNT [OFFSET+LIMIT] vous pouvez limiter les résultats, et avec les curseurs, allez directement à la ligne que vous souhaitez, puis bouclez jusqu'à la fin.

Donc, votre requête serait comme ceci:

SET ROWCOUNT 75 -- (50 + 25)
DECLARE MyCursor SCROLL CURSOR FOR SELECT * FROM pessoas
OPEN MyCursor
FETCH ABSOLUTE 50 FROM MyCursor -- OFFSET
WHILE @@FETCH_STATUS = 0 BEGIN
    FETCH next FROM MyCursor
END
CLOSE MyCursor
DEALLOCATE MyCursor
SET ROWCOUNT 0

La meilleure façon de le faire sans perdre de temps pour commander des disques est comme ceci:

select 0 as tmp,Column1 from Table1 Order by tmp OFFSET 5000000 ROWS FETCH NEXT 50 ROWS ONLY

cela prend moins d'une seconde!
meilleure solution pour les grandes tables.


Le suivant affichera 25 enregistrements à l'exclusion des travaux 50 premiers enregistrements dans SQL Server 2012.

SELECT * FROM MyTable ORDER BY ID OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;

vous pouvez remplacer l'identification en tant que votre condition


Selon votre version, vous ne pouvez pas le faire directement, mais vous pourriez faire quelque chose comme un hacky

select top 25 *
from ( 
  select top 75 *
  from   table 
  order by field asc
) a 
order by field desc 

où 'champ' est la clé.


Si vous allez traiter toutes les pages dans l'ordre, souvenez-vous simplement de la dernière valeur clé vue sur la page précédente et utilisez TOP (25) ... WHERE Key > @last_key ORDER BY Key peut être la méthode la plus performante si des index appropriés existent Ceci doit être recherché efficacement - ou un curseur API si ce n'est pas le cas.

Pour sélectionner une page arbitraire, la meilleure solution pour SQL Server 2005 - 2008 R2 est probablement ROW_NUMBER et ROW_NUMBER .

Pour SQL Server 2012+, vous pouvez utiliser la clause ORDER BY améliorée pour ce besoin.

SELECT  *
FROM     MyTable 
ORDER BY OrderingColumn ASC 
OFFSET  50 ROWS 
FETCH NEXT 25 ROWS ONLY 

Bien qu'il reste à voir à quel point cette option sera performante .


Vous devez être prudent lorsque vous utilisez l'instruction row_number () OVER (ORDER BY), car performane est assez pauvre. Il en va de même pour l'utilisation de Common Table Expressions avec row_number () qui est encore pire. J'utilise l'extrait suivant qui s'est avéré être légèrement plus rapide que l'utilisation d'une variable de table avec une identité pour fournir le numéro de page.

DECLARE @Offset INT = 120000
DECLARE @Limit INT = 10

DECLARE @ROWCOUNT INT = @[email protected]
SET ROWCOUNT @ROWCOUNT

SELECT * FROM MyTable INTO #ResultSet
WHERE MyTable.Type = 1

SELECT * FROM
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY SortConst ASC) As RowNumber FROM
    (
        SELECT *, 1 As SortConst FROM #ResultSet
    ) AS ResultSet
) AS Page
WHERE RowNumber BETWEEN @Offset AND @ROWCOUNT

DROP TABLE #ResultSet

Vous pouvez utiliser la fonction ROW_NUMBER() pour obtenir ce que vous voulez:

SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY id) RowNr, id FROM tbl) t
WHERE RowNr BETWEEN 10 AND 20




sql-server