web-dev-qa-db-fra.com

Enregistrement d'une valeur de comptage sélectionnée (*) dans un entier (SQL Server)

J'ai des problèmes avec cette déclaration, en raison sans aucun doute de mon ignorance de ce qui est renvoyé de cette déclaration sélective:

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

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

Il y a des enregistrements dans myTable, mais lorsque j'exécute le code ci-dessus, l'instruction print n'est jamais exécutée. Des vérifications supplémentaires montrent que myInt est en fait nul après l'affectation ci-dessus. Je suis sûr que je manque quelque chose, mais j'ai supposé qu'un compte sélectionné retournerait un scalaire que je pourrais utiliser ci-dessus?

19
larryq

Si @myInt vaut zéro, cela signifie qu'il n'y a pas de lignes dans le tableau: ce serait NULL s'il n'est jamais défini du tout.

COUNT renvoie toujours une ligne, même pour aucune ligne dans un tableau.

Edit, avril 2012: les règles pour cela sont décrites dans ma réponse ici: COUNT (*) renvoie-t-il toujours un résultat?

Votre compte/affectation est correct mais pourrait être dans les deux cas:

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

Cependant, si vous recherchez simplement l'existence de lignes, (NOT) EXISTS est plus efficace:

IF NOT EXISTS (SELECT * FROM myTable)
37
gbn
select @myInt = COUNT(*) from myTable
11
user151323
Declare @MyInt int
Set @MyInt = ( Select Count(*) From MyTable )

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

Je ne sais pas si c'est votre problème, mais vous devez esacpe la citation unique dans la déclaration d'impression avec une deuxième citation unique. Bien que vous puissiez utiliser SELECT pour remplir la variable, utiliser SET comme vous l'avez fait ici est très bien et plus clair IMO. De plus, vous pouvez être assuré que Count (*) ne renverra jamais une valeur négative, il vous suffit donc de vérifier si elle est supérieure à zéro.

5
Thomas

[mise à jour] - Eh bien, ma propre folie fournit la réponse à celle-ci. Il s'avère que je supprimais les enregistrements de myTable avant d'exécuter l'instruction COUNT.

Comment ai-je fait cela sans le remarquer? Heureux que vous ayez demandé. J'ai testé une plate-forme de test d'unité sql (tsqlunit, si vous êtes intéressé) et dans le cadre de l'un des tests, j'ai exécuté une instruction de table tronquée, puis la ci-dessus. Une fois le test unitaire terminé, tout est annulé et les enregistrements sont de retour dans myTable. C'est pourquoi j'ai obtenu un nombre record en dehors de mes tests.

Désolé tout le monde ... merci pour votre aide.

2
larryq