Предложение OVER изменяет совокупный диапазон, чтобы запрос мог выполняться так, как вы хотите
SELECT
Column1,
Count(Column1) OVER (),
Count(Column2) OVER ()
FROM Table1
Редактировать:
выше для SQL Server 2005 +
Редактировать 2:
Решение CROSS JOIN / COUNT в SQL Server 2000 не является надежным под нагрузкой.
Попробуйте это из нескольких соединений, заметьте, что @@ ROWCOUNT никогда не будет равняться T2.cnt в соединении 2
--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 clustered 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 @@ROWCOUNT
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 @@ROWCOUNT
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 @@ROWCOUNT
Edit3: cyberkiwi заявил, что тест не соответствует действительности. Мусор.
Если вы забудете @@ ROWCOUNT, вы увидите, что cnt
отличается от количества строк в «сеточном режиме» SSMS
Теперь вы используете SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
, и он дает правильные результаты, но если вы достаточно заняты, чтобы получить противоречивые результаты, действительно ли вы хотите запустить это?
Используйте временную таблицу для обеспечения согласованного набора данных, если вы работаете с SQL Server 2000.