2009-05-07 9 views
0

Voici ce que je veux faire:Passer la valeur du paramètre par défaut vs ne pas passer le paramètre du tout?

donné une table

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

Et un moyen de procédure stockée

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

Est-il dire si j'ai appelé cette procédure

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

indiquant effectivement que la personne avec id de 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 veux dire (dans la procédure stockée) si "la valeur par défaut a été utilisée parce qu'elle n'a pas été spécifiée" de "J'ai explicitement appelé cette procédure en passant la valeur qui est identique à celle par défaut ".

Je sais qu'il y a plusieurs façons d'accomplir ce que je veux faire comme passer XML ou bitmask de champs en cours de mise à jour, mais pour le moment je veux juste m'assurer que cette technique exacte est possible ou non. Editer: Passer des valeurs réservées ne fonctionne pas pour les champs avec de petits types de plage tels que les bits. Les procédures de surcharge sont également une option inacceptable. Créer un type défini par l'utilisateur qui étend le paradigme NULL avec une valeur supplémentaire "NotAValue" pourrait être une réponse, mais j'ai besoin de plus de conseils sur la façon de l'implémenter.

Répondre

1

Ma conjecture est non, vous ne pouvez pas distinguer ces deux choses.

Ma suggestion est d'utiliser une valeur par défaut que vous ne transmettez jamais en argument. à savoir si la valeur par défaut est null, alors vous pourriez peut-être passer à 0 comme valeur pour @newBoots

+0

Oui, c'est un moyen, mais ce serait un problème avec les champs de bits. –

1

non, la valeur nulle par défaut « regarde » le même comme passé dans null

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

0

strictement, non, il n'y a pas d'installation réelle pour y arriver. Vous pouvez cependant essayer d'utiliser une sorte de valeur réservée pour le paramètre (un très petit nombre négatif, par exemple) pour l'indiquer.

0

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 des bits. Je n'ai pas accès à un serveur SQL, mais j'aime parfois penser quelque chose; mais je pense que vous pourriez être en mesure de comprendre ysubg une manipulation de la chaîne sur certaines vues/fonctions de gestion. Vous auriez besoin de courir avec un diable de beaucoup de privilège, mais si son absolument neccessary je ne t vois pas pourquoi tu ne peux pas travailler dehors de st.text en utilisant quelque chose comme ça

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 
+0

Eh bien ... Je ne comprends pas exactement ce que vous suggérez, mais je pense que j'ai l'idée et l'idée est la réflexion. Le but réel de ma question est de réduire les frais généraux, de sorte que les sous-requêtes complexes ne sont pas une réponse car il existe des solutions moins coûteuses pour cela. Bonne idée quand même! –

+0

Il parle de récupérer l'instruction TSQL qui a été exécutée. SQL Server enregistre toutes les commandes SQL exécutées et vous pouvez les voir à partir des vues système. Malheureusement, la vue qu'il a fournie renvoie l'instruction compilée - ainsi, depuis la procédure stockée, tout ce que vous obtenez est la définition de proc stockée, pas le code appelant. – Rick

0

Comme indiqué, TSQL n » t distinguer entre fournir la valeur par défaut et ne pas fournir une valeur. Je pense que le moteur substitue essentiellement les valeurs par défaut pour tous les paramètres manquants (ou params appelés avec le mot-clé DEFAULT.)

A la place, utilisez 0 comme "No Hat", et NULL comme aucun paramètre spécifié.C'est l'utilisation préférée de NULL, où elle signifie valeur inconnue ou non spécifiée. En utilisant NULL comme "No Hat", vous l'avez co-opté dans l'ajout d'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 le 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 (maintenant trois options, 1/0/NULL.) Ma recommandation est toujours que si vous trouvez que vous n'avez plus de valeurs dans le type de données en cours, vous utilisez un type trop petit.

Retour à la procédure stockée appelant; Si vous définissez vos valeurs par défaut sur NULL et que vous traitez NULL comme non défini ou non spécifié, les appelants doivent toujours spécifier une valeur non nulle lors de l'appel de 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.

Questions connexes