Сохранение значения счетчика выбора (*) в целое число (SQL Server) - PullRequest
17 голосов
/ 08 марта 2010

У меня возникли некоторые проблемы с этим утверждением, без сомнения из-за моего незнания того, что возвращается из этого оператора select:

declare @myInt as INT
set @myInt = (select COUNT(*) from myTable as count)

if(@myInt <> 0) 
begin
   print 'there's something in the table'
end

В myTable есть записи, но когда я запускаю код выше, оператор print никогда не запускается. Дальнейшие проверки показывают, что myInt фактически равен нулю после присвоения выше. Я уверен, что что-то упустил, но я предполагал, что счетчик выбора вернет скаляр, который я мог бы использовать выше?

Ответы [ 4 ]

37 голосов
/ 08 марта 2010

Если @myInt равен нулю, это означает, что в таблице нет строк: оно будет равно NULL, если вообще не задано.

COUNT всегда будет возвращать строку, даже если в таблице нет строк.

Edit, Apr 2012: правила для этого описаны в моем ответе здесь: Всегда ли COUNT (*) возвращает результат?

Ваш счет / назначение верен, но может быть любым из следующих способов:

select @myInt = COUNT(*) from myTable
set @myInt = (select COUNT(*) from myTable)

Однако, если вы просто ищете наличие строк, (НЕ) EXISTS более эффективен:

IF NOT EXISTS (SELECT * FROM myTable)
11 голосов
/ 08 марта 2010
select @myInt = COUNT(*) from myTable
5 голосов
/ 08 марта 2010
Declare @MyInt int
Set @MyInt = ( Select Count(*) From MyTable )

If @MyInt > 0
Begin
    Print 'There''s something in the table'
End

Я не уверен, что это ваша проблема, но вы должны добавить одинарную кавычку в операторе печати со второй одинарной кавычкой. В то время как вы можете использовать SELECT для заполнения переменной, использование SET, как вы сделали здесь, просто отлично и понятнее IMO. Кроме того, вы можете быть уверены, что Count (*) никогда не вернет отрицательное значение, поэтому вам нужно только проверить, больше ли оно нуля.

1 голос
/ 09 марта 2010

[обновление] - Ну, моя собственная глупость дает ответ на этот вопрос. Как оказалось, я удалял записи из myTable перед выполнением оператора SELECT COUNT.

Как я это сделал и не заметил? Рад, что ты спросил. Я тестировал платформу модульного тестирования sql (tsqlunit, если вам интересно) и в рамках одного из тестов я выполнил оператор таблицы усечения, а затем выше. После завершения модульного теста все откатывается, а записи возвращаются в myTable. Вот почему я получил количество записей за пределами моих тестов.

Извините всех ... спасибо за вашу помощь.

...