2010-03-08 17 views
11

Estoy teniendo algunos problemas con esta declaración, sin duda debido a mi ignorancia de lo que se devuelve de esta instrucción de selección:memorización de un select count (*) a un entero (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 

Hay registros en myTable, pero cuando ejecuto el código anterior, nunca se ejecuta la declaración de impresión. Verificaciones adicionales muestran que myInt es de hecho cero después de la asignación anterior. Estoy seguro de que me falta algo, pero asumí que un recuento selectivo devolvería un escalar que podría usar anteriormente.

+0

Este código funciona bien para mi en un par de servidores al que tengo acceso. ¿Puede explicar la situación que está causando este comportamiento? ¿Un antiguo "SELECT COUNT (*) FROM Table" devuelve lo que esperas? – SqlRyan

Respuesta

32

Si @myInt es cero significa que no hay filas en la tabla: sería NULL si nunca se configuró en absoluto.

COUNT siempre devolverá una fila, incluso para ninguna fila en una tabla.

Editar, abr 2012: las reglas de este se describen en mi respuesta aquí: Does COUNT(*) always return a result?

Su recuento/asignación es correcta, pero podría ser de cualquier manera:

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

Sin embargo, si usted es sólo en busca de la existencia de filas, (NO) que existe es más eficiente:

IF NOT EXISTS (SELECT * FROM myTable) 
9
select @myInt = COUNT(*) from myTable 
+0

Esta no es la respuesta, solo una construcción de asignación alternativa. Todavía dará "cero" – gbn

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

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

No estoy seguro de si este es su problema, pero debe suprimir la comilla simple en la declaración de impresión con una segunda comilla simple. Si bien puede usar SELECT para completar la variable, usar SET como lo ha hecho aquí es IMO perfecto y más claro. Además, puede tener la garantía de que Count (*) nunca devolverá un valor negativo, por lo que solo debe comprobar si es mayor que cero.

+0

Cambié la declaración de impresión para que tuviera sentido en mi publicación (tenía un mensaje específico del negocio) y olvidé escapar de la cita. ¡Gracias por su ayuda en la elección de seleccionar/configurar! – larryq

0

[actualizar] - Bueno, mi propia tontería proporciona la respuesta a esta. Resultó que estaba borrando los registros de myTable antes de ejecutar la instrucción COUNT seleccionada.

¿Cómo lo hice y no me di cuenta? Me alegro de que preguntaras. He estado probando una plataforma de prueba de unidad sql (tsqlunit, if you're interested) y como parte de una de las pruebas ejecuté una declaración de tabla truncada, luego la anterior. Una vez que finaliza la prueba unitaria, todo se revierte y los registros vuelven a estar en myTable. Es por eso que tengo un recuento de registros fuera de mis pruebas.

Disculpe a todos ... gracias por su ayuda.

Cuestiones relacionadas