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?
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)
select @myInt = COUNT(*) from myTable
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.
[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.