Я испытываю некоторые затруднения из-за этого оператора, будучи должен несомненно моему незнанию того, что возвращается из этого избранного оператора:
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, но когда я работаю, код выше оператора печати никогда не выполняется. Дальнейшие проверки показывают, что myInt является на самом деле нулем после присвоения выше. Я уверен, что пропускаю что-то, но я предположил, что избранное количество возвратит скаляр, который я мог использовать выше?
Если @myInt равен нулю, это означает, что в таблице нет строк: он будет NULL, если его вообще никогда не устанавливать.
COUNT всегда будет возвращать строку, даже если в таблице нет строк.
Edit, Apr 2012: the rules for this are described in my answer here:Does COUNT(*) always return a result?
Your count/assign is correct but could be either way:
select @myInt = COUNT(*) from myTable
set @myInt = (select COUNT(*) from myTable)
However, if you are just looking for the existence of rows, (NOT) EXISTS is more efficient:
IF NOT EXISTS (SELECT * FROM myTable)
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 (*) никогда не вернет отрицательное значение, поэтому вам нужно только проверить, больше ли оно нуля.
[обновление] - Ну, моя собственная глупость дает ответ на этот вопрос. Как оказалось, я удалял записи из myTable перед запуском оператора select COUNT.
Как я это сделал и не заметил? Рад, что ты спросил. Я тестировал платформу модульного тестирования sql (tsqlunit, если вам интересно) , и в рамках одного из тестов я выполнил оператор усечения таблицы, а затем указанное выше. После завершения модульного теста все откатывается, и записи возвращаются в myTable. Вот почему я получил рекордное количество за пределами моих тестов.
Извините всех ... спасибо за вашу помощь.