Comment vérifier si une requête select résultat est NULL en SQL Server
dans SQL Server , comment puis-je vérifier si une requête a retourné NULL et exécuter des blocs en fonction de cela . par exemple, dans la requête 1 , je veux vérifier if count(*) is not null
et de vérifier ensuite si elle a >0 . Dois-je utiliser if exists
ici ?
if select count(*) from tbl1 not is NULL then
if select count(*) from tbl1 where count(*)>0 then
raiserror()
end if
end if
Dans Oracle on peut dire IF INSERTING THEN
ou IF updating THEN
ou if deleting then
exécuter un bloc de code basé sur une colonne . comment pouvons-nous le faire dans SQL Server ? Veuillez consulter l'Oracle de code ci-dessous .
CREATE OR REPLACE TRIGGER tr_name
BEFORE DELETE OR INSERT OR UPDATE OF column1 ON tbl1
FOR EACH ROW
WHEN (NEW.column1 IS NOT NULL)
begin
IF INSERTING THEN
run some code like check if there are more than row in a table and if >0 then not allow any inserts
IF updating THEN
run some code
IF deleting THEN
run some code
end
COUNT
ne retourne jamaisNULL
.- Merci , qu'est-Ce que l'utilisation de
-1
ici ? - Ce n'est pas parce que
COUNT(*)
ne retourne jamaisNULL
- Je ne peux vraiment pas penser à un cas de cette, à moins que vous l'utilisez dans une sous-requête et se joindre à elle. Ensuite, il n'est plus COUNT(*), c'est juste une partie d'un jeu d'enregistrements.
- Peut-être que mon exemple n'est pas tout à fait droit . Donc ma question était de savoir si une requête renvoie la valeur NULL, alors comment puis-je écrire un bloc selon eux . Peut-être que le count(*) exemple n'est pas bon pour cela . Mais pour tous les autres cas dois-je utiliser
ISNULL(select name from tbl1 where name ='a name')>0
- Merci. A la recherche d'un moyen de formuler cela 🙂
- Vous dites aussi
where count(*) > 0
qui n'a pas beaucoup de sens non plus. Les agrégats ne peuvent pas apparaître dansWHERE
clauses, justeHAVING
, et sansGROUP BY
qui ne fonctionne pas. - Êtes-vous certain que vous voulez écrire un bloc? Ou voulez-vous évaluer ce sur ligne par ligne?
- Il serait peut-être préférable si vous pouvez décrire ce que vous êtes en train d'essayer de faire. Vous obtiendrez de meilleurs résultats qu'avec ces exemples inventées.
- Vous pouvez également consulter le page MSDN sur
ISNULL
, parce que je ne le pense pas ce que vous pensez que cela fonctionne, compte tenu de votreISNULL(...) > 0
exemple dans ce commentaire. - Aussi garder à l'esprit une requête ne retourne NULL. Une colonne ne. Une requête peut retourner pas de lignes (dans ce cas, un COMTE de retour 0)
- Si vous venez de vérifier si une requête renvoie des résultats ou non, puis oui, vous devez utiliser
IF EXISTS (<query>)...
- J'ai maintenant édité la question et il montre maintenant ce que j'essayais de faire .
- Donc, vous êtes en train de rédiger un déclencheur et que vous voulez détecter ce type d'opération a provoqué le déclenchement de l'incendie?
- Oui , c'est exact, Damien et ensuite faire la vérification (j'ai maintenant de bons exemples pour la vérification de la grâce à tous les utilisateurs ici)
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas obtenir nulle à partir d'un compte donc si vous faites un chèque de 0 c'est pratiquement l'équivalent.
L'autre, si des contrôles pour rien que le comte revient
vous pouvez également utiliser un
IF EXISTS
EXISTS
plutôt que de forcer le serveur pour effectuer un calcul complet si tout ce qui vous intéresse ce sont0
etat least 1
.SELECT count(*) FROM tbl1 = 0
est très certainement une mauvaise syntaxe. Pourquoi insistez-vous pour que cela fonctionne? En ce qui concerne le deuxième morceau de code: un nombre toujours renvoie quelque chose de si toujours "existe".NOT EXISTS (SELECT count(*) FROM tbl1)
est toujoursFALSE
. Vous pouvez éditer que peu maintenant.IF EXISTS (SELECT count(*) FROM tbl1)
toujours renvoie la valeur true. :|. Jamais l'esprit. Cette question est d'une épave de train et l'OP est révolue depuis longtemps.Si vous écrivez un déclencheur vous n'avez généralement pas la peine de vérifier si quelque chose existe dans le pseduo table, il vous suffit d'écrire le code en fonction de la pseudo table. Notez aussi que l'oracle déclenche exécuter ligne par ligne de SQL Server et les déclencheurs sont appelés une fois, avec éventuellement plusieurs dossiers en pseudo tables.
Donc, si vous voulez faire quelque chose comme ceci dans votre déclencheur:
INSERTED
est un pseudo de la table. Il contient tous les enregistrements insérés (ou mis à jour). Il peut y avoir 0, 1 ou plusieurs enregistrements dans ici.Si il ya zéro des enregistrements, rien ne sera inséré par le présent code.
Revenir à votre question initiale, la meilleure façon de vérifier si il n'y a pas de lignes est pour ce faire:
Ou, dans un déclencheur, vous pouvez simplement spécifier le trigger ne se déclenche pas à tous les UPDATE ou INSERT.
reviendra pas. des enregistrements sélectionnés par la requête select.