Question

Voici ce que je veux faire:

Étant donné une table

PeopleOutfit (id int primary key, boots int, hat int)

Et une procédure stockée

UpdateOutfit @id int, @newBoots int = null, @newHat = null

Existe-t-il un moyen de savoir si j'ai appelé cette procédure

exec UpdateOutfit @id=1, @newBoots=null, @newHat=5

disant effectivement que la personne dont l'identifiant est égal à 1 doit maintenant être pieds nus et porter le cinquième chapeau de

exec UpdateOutfit @id=1, @newHat=5

qui demande à cette personne de porter un cinquième chapeau en gardant ses bottes actuelles?

En d'autres termes, je souhaite indiquer (dans la procédure stockée) si "la valeur par défaut a été utilisée car elle n'a pas été spécifiée". de "J'ai explicitement appelé cette procédure en transmettant la valeur qui se trouve être la même que celle par défaut".

Je sais qu'il y a plusieurs façons d'accomplir ce que je veux faire, par exemple en transmettant du XML ou le masque de bits en cours de mise à jour, mais pour le moment, je veux simplement m'assurer que cette technique exacte est possible ou non.

Edition: le passage de valeurs réservées ne fonctionne pas pour les champs avec des types de plage réduits tels que bit. Les procédures de surcharge sont également une option inacceptable. Création d'un type défini par l'utilisateur qui étend le paradigme NULL avec des options supplémentaires "NotAValue" La valeur peut être une réponse, mais j’ai besoin de conseils supplémentaires sur la façon de la mettre en œuvre.

Était-ce utile?

La solution

Je suppose que non, vous ne pouvez pas distinguer ces deux choses.

Je suggère d'utiliser une valeur par défaut que vous ne transmettriez jamais sous forme d'argument. c'est-à-dire si la valeur par défaut est null , vous pouvez peut-être indiquer 0 comme valeur pour @newBoots

.

Autres conseils

Non, la valeur null par défaut "recherche" la même chose qu'un passé en null

éventuellement faire votre -1 par défaut et utiliser la logique pour faire quelque chose de différent.

Strictement, non, il n’ya pas de réelle facilité pour accomplir cela. Vous pouvez toutefois essayer d’utiliser une sorte de valeur réservée pour le paramètre (un très petit nombre négatif, par exemple) pour indiquer cela.

Je n'ai jamais fait cela moi-même; introduit le bit à 3 états (en utilisant un entier) dans un code pour gérer la situation de bit. Je n'ai pas accès à un serveur SQL mais j'aime bien la pensée ultime parfois; mais je pense que vous pourriez être en mesure de comprendre une manipulation de chaîne sur certaines vues / fonctions de gestion. Vous auriez besoin de courir avec énormément de privilèges, mais si c'est absolument nécessaire, je ne vois pas pourquoi vous ne pouvez pas résoudre le problème à partir de st.text en utilisant quelque chose comme ceci

SELECT  
    st.text
FROM
    sys.dm_exec_requests r
CROSS APPLY 
    sys.dm_exec_sql_text(sql_handle) AS st
WHERE
    r.session_id = @@SPID

Comme indiqué, TSQL ne fait pas la distinction entre fournir la valeur par défaut et ne pas fournir de valeur. Je pense que le moteur substitue les valeurs par défaut à tous les paramètres manquants (ou aux paramètres appelés avec le mot clé DEFAULT.)

À la place, utilisez 0 comme "Pas de chapeau" et NULL comme aucun paramètre spécifié. C'est l'utilisation préférée de NULL, où cela signifie une valeur inconnue ou non spécifiée. En utilisant NULL en tant que "No Hat", vous l'avez coopté pour ajouter une valeur supplémentaire à la plage de votre type de données.

Pensez-y en termes de type de données BIT. Le type de données est défini pour représenter une valeur binaire (1 ou 0, ou T / F si vous préférez la considérer comme un booléen.) En traitant NULL comme une valeur valide, vous avez étendu le type de données au-delà des options binaires (avez maintenant Trois options, 1/0 / NULL.) Ma recommandation est toujours que, si vous constatez que le type de données actuel est à court de valeurs, vous utilisez un type trop petit.

Retour à l'appel de procédure stockée; Si vous définissez vos valeurs par défaut sur NULL et que vous considérez NULL comme non défini ou non spécifié, les appelants doivent toujours spécifier une valeur non NULL lors de l'appel du proc. Si vous obtenez une valeur NULL, supposez qu’ils n’ont pas fourni de valeur, fourni une valeur NULL ou utilisé le mot clé DEFAULT.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top