Сохранение значения count (*) для целого числа (SQL Server)

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

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

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

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

Ответ 1

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

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

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

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

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

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

IF NOT EXISTS (SELECT * FROM myTable)

Ответ 2

select @myInt = COUNT(*) from myTable

Ответ 3

Declare @MyInt int
Set @MyInt = ( Select Count(*) From MyTable )

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

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

Ответ 4

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

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

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