T-Procédure Stockée SQL NULL valeurs d'entrée de cause instruction select à l'échec
Ci-dessous est une procédure stockée pour vérifier si il y a un doublon dans la base de données fondée sur la vérification de tous les champs individuellement (ne me demandez pas pourquoi je devrais le faire, il a juste à être de cette façon).
Il sonne parfaitement simple, mais le PS échoue.
Le problème est que certains paramètres passés à la SP peut avoir une valeur nulle et, par conséquent, le sql, il faudrait lire "est null" plutôt que "= null".
J'ai essayé la fonction isnull(),cas des déclarations se fondent() et sql dynamique avec exec() et sp_executesql et a échoué à mettre en œuvre l'un de ces. Voici le code...
CREATE PROCEDURE sp_myDuplicateCheck
@userId int,
@noteType char(1),
@aCode char(3),
@bCode char(3),
@cCode char(3),
@outDuplicateFound int OUT
AS
BEGIN
SET @outDuplicateFound = (SELECT Top 1 id FROM codeTable
WHERE userId = @userId
AND noteType = @noteType
AND aCode = @aCode
AND bCode = @bCode
AND cCode = @cCode
)
-- Now set the duplicate output flag to a 1 or a 0
IF (@outDuplicateFound IS NULL) OR (@outDuplicateFound = '') OR (@outDuplicateFound = 0)
SET @outDuplicateFound = 0
ELSE
SET @outDuplicateFound = 1
END
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez besoin de quelque chose de ce genre pour chacun éventuellement null paramètre:
Si je comprends votre question correctement, alors je vous encourage à faire un peu de recherche sur:
Si vous utilisez cette commande dans votre procédure stockée, vous pouvez utiliser = NULL dans votre comparaison. Jetez un oeil à l'exemple de code suivant pour voir comment cela fonctionne.
Chaque fois que vous SET ANSI_NULLS, il est une bonne pratique pour la définir à dès que possible, car cela peut affecter les autres questions que vous avez exécuté plus tard. Toutes les commandes de configuration affectent uniquement la session en cours, mais en fonction de votre application, ce qui pourrait s'étendre sur plusieurs requêtes, c'est pourquoi je vous suggère de vous tourner ansi null arrière immédiatement après cette requête.
Je pense que cela doit fonctionner avec FUSIONNENT fonction. Essayez ceci:
Bonne Chance!
Jason
Essayez ceci :
Ce que cela fait est de fournir des valeurs par défaut pour les paramètres d'entrée en cas de null et puis, dans la condition where de contrôles seulement si les valeurs ne sont pas égales aux valeurs par défaut.
Je voudrais tout d'abord d'ajouter une case pour voir si tous les paramètres ont été nulle au moment de l'exécution, c'est à dire,
Puis, après que vous avez validé que l'utilisateur est passé quelque chose que vous pouvez utiliser quelque chose comme ceci dans votre clause where
EDIT: j'ai peut-être raté l'intention, si le paramètre a été passé en null, cela signifie que vous ne souhaitiez tester la colonne null. Mon ci-dessus où la clause suppose que le paramètre null signifie " sauter le test sur cette colonne.'
Sinon, je crois que vous pouvez utiliser votre requête initiale et ajouter l'option set ANSI_NULLS à la procédure stockée de la création. Par exemple,
Effectivement, cela devrait permettre à votre code pour ensuite évaluer colonne=null par opposition à colonne est null. Je pense que Kalen Delaney une fois inventé l'ANSI_NULLS et QUOTED_IDENTIFIER options comme "collante options" parce que si ils sont définis à la procédure de créer leur séjour à la procédure au moment de l'exécution, indépendamment de la façon dont la connexion à l'heure est réglée.
SET ANSI_NULLS OFF/On
De cette façon, vous pouvez faire
colName = null