¿Puedo get count () y filas de una consulta sql en el server sql?

Me gustaría get el recuento total de resultados y las primeras n filas de alguna consulta: ¿es posible en una statement?

Esperaría los resultados como:

count(..) column1 column2 125 some_value some_value 125 some_value some_value 

¡Gracias de antemano!

Me gusta esto:

 SELECT TOP 100 --optional MC.Cnt, M.Column1, M.Column2 FROM myTable M CROSS JOIN (SELECT COUNT(*) AS Cnt FROM myTable) MC 

Editar: después de la respuesta downvote y COUNT / OVER. Una comparación en 2 tablas mías

Puedes ver una gran diferencia entre mi agregado CROSS JOIN / simple y una cláusula COUNT / empty ORDER BY

 SELECT COUNT(*) OVER() AS C, key1col, key2col FROM myTable (24717 row(s) affected) Table 'Worktable'. Scan count 3, logical reads 49865, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'myTable'. Scan count 1, logical reads 77, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. StmtText |--Nested Loops(Inner Join) |--Table Spool | |--Segment | |--Index Scan(OBJECT:([MyDB].[dbo].[myTable].[IX_useful])) |--Nested Loops(Inner Join, WHERE:((1))) |--Compute Scalar(DEFINE:([Expr1003]=CONVERT_IMPLICIT(int,[Expr1005],0))) | |--Stream Aggregate(DEFINE:([Expr1005]=Count(*))) | |--Table Spool |--Table Spool SELECT MC.Cnt, M.key1col, M.key2col FROM myTable M CROSS JOIN (SELECT COUNT(*) AS Cnt FROM myTable) MC (24717 row(s) affected) Table 'myTable'. Scan count 2, logical reads 154, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. StmtText |--Nested Loops(Inner Join) |--Compute Scalar(DEFINE:([Expr1005]=CONVERT_IMPLICIT(int,[Expr1009],0))) | |--Stream Aggregate(DEFINE:([Expr1009]=Count(*))) | |--Index Scan(OBJECT:([MyDB].[dbo].[myTable].[IX_useful])) |--Index Scan(OBJECT:([MyDB].[dbo].[myTable].[IX_useful] AS [M])) 

He repetido esto en una table con 570k filas y aquí está el IO

 Table 'Worktable'. Scan count 3, logical reads 1535456, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'myTable'. Scan count 1, logical reads 2929, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'myTable'. Scan count 34, logical reads 6438, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

qué pasa

 SELECT COUNT(*) OVER() AS C, COLUMN1, COLUMN2 FROM TABLE 

Con respecto a las consultas CROSS JOIN
En un entorno pesado INSERT / DELETE , la combinación cruzada devolverá el conteo de filas incorrecto.

Pruebe esto desde múltiples conexiones
connection 1

 set nocount on; drop table dbo.test_table; GO create table dbo.test_table ( id_field uniqueidentifier not null default(newid()), filler char(2000) not null default('a') ); GO create unique clustenetworking index idx_id_fld on dbo.test_table(id_field); GO while 1 = 1 insert into dbo.test_table default values; 

connection 2

 select T2.cnt, T1.id_field, T1.filler from dbo.test_table T1 cross join (select COUNT(*) as cnt from dbo.test_table) T2 select T2.cnt, T1.id_field, T1.filler from dbo.test_table T1 cross join (select COUNT(*) as cnt from dbo.test_table) T2 select T2.cnt, T1.id_field, T1.filler from dbo.test_table T1 cross join (select COUNT(*) as cnt from dbo.test_table) T2 

Cada vez, el conteo de loggings ( @@ROWCOUNT ) es diferente a T2.cnt

En el caso de COUNT(*) OVER() , solo hay un escaneo de tabla único y @@ROWCOUNT es siempre el mismo que T2.cnt

En cuanto a los planes de consulta: SQL 2005 SP3 parece ser mucho más débil al hacer COUNT(*) OVER() que SQL 2008 R2. Además de eso, informa incorrectamente los costos de consulta (nunca pensé que una consulta secundaria podría costar más del 100% de la consulta completa).

En muchos escenarios, el costo del COUNT(*) OVER() es entre 50-75% de CROSS JOIN

El mejor escenario para una combinación cruzada sería si hubiera un índice muy estrecho para hacer la count. De esta forma habrá un análisis de índice agrupado para los datos + un análisis de índice para el recuento.

Como siempre, lo mejor es medir, medir, medir e ir con el compromiso con el que está feliz de vivir.

Puedes hacer esto con CROSS JOIN y CTE, pero no es muy eficiente:

 WITH Rows_CTE AS ( SELECT Column1, Column2 FROM Table WHERE (...) ) SELECT c.Cnt, r.Column1, r.Column2 FROM Rows_CTE r CROSS JOIN (SELECT COUNT(*) AS Cnt FROM Rows_CTE) c 

Creo que una mejor forma de get lo que desea sería usar una única consulta pero múltiples sets de resultados , lo que puede hacer utilizando COMPUTE :

 SELECT Column1, Column2 FROM Table WHERE (...) COMPUTE COUNT([Column1]) 

probar esta consulta:

 select ColumnId,Descr,(select COUNT(*) from ColumnSetUp)as c from ColumnSetUp group by ColumnId,Descr