Сохранение значения 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. Вот почему я получил показатель за пределами моих тестов.
Извините, все... спасибо за вашу помощь.