Сохранение избранного количества (*) оценивает целому числу (SQL Server)

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

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 является на самом деле нулем после присвоения выше. Я уверен, что пропускаю что-то, но я предположил, что избранное количество возвратит скаляр, который я мог использовать выше?

17
задан larryq 9 March 2010 в 00:16
поделиться

4 ответа

Если @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)
37
ответ дан 30 November 2019 в 10:27
поделиться
select @myInt = COUNT(*) from myTable
11
ответ дан 30 November 2019 в 10:27
поделиться
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 (*) никогда не вернет отрицательное значение, поэтому вам нужно только проверить, больше ли оно нуля.

5
ответ дан 30 November 2019 в 10:27
поделиться

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

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

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

2
ответ дан 30 November 2019 в 10:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: