Pregunta

Esto es lo que quiero hacer:

Dada una tabla

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

Y un procedimiento almacenado

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

¿Hay alguna manera de saber si llamé a este procedimiento como

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

efectivamente diciendo que la persona con la identificación de 1 ahora debe estar descalzo y usar el quinto sombrero de

exec UpdateOutfit @id=1, @newHat=5
¿

que instruye a esta persona a usar el quinto sombrero manteniendo sus botas actuales?

En otras palabras, quiero decir (dentro del procedimiento almacenado) si " se usó el valor predeterminado porque no se especificó " desde " explícitamente llamé a este procedimiento pasando el valor que resulta ser el mismo que el predeterminado ''.

Sé que hay varias formas de lograr lo que quiero hacer, como pasar XML o la máscara de bits de los campos que se actualizan, pero por el momento solo quiero asegurarme de si esta técnica exacta es posible o no.

Editar: Pasar valores reservados no funciona para campos con tipos de rango pequeño como bit. Los procedimientos de sobrecarga también son una opción que no es aceptable. Crear un tipo definido por el usuario que amplíe el paradigma NULL con "NotAValue" adicional el valor puede ser una respuesta, pero necesito más orientación sobre cómo implementarlo.

¿Fue útil?

Solución

Supongo que no, no puedes distinguir esas dos cosas.

Mi sugerencia es utilizar un valor predeterminado que nunca pasaría como argumento. es decir, si el valor predeterminado es null , entonces tal vez podría pasar 0 como el valor de @newBoots

Otros consejos

no, el valor nulo predeterminado "se ve" lo mismo que un pasado en nulo

posiblemente haga su valor predeterminado -1 y use la lógica para hacer algo diferente.

Estrictamente, no, no hay una instalación real para lograr esto. Sin embargo, podría intentar usar algún tipo de valor reservado para el parámetro (un número negativo muy pequeño, por ejemplo) para indicar esto.

Nunca hice esto yo mismo; introdujo el bit de 3 estados (usando un número entero) en algún código para manejar la situación del bit. No tengo acceso a un servidor SQL pero a veces me gusta el pensamiento latteral; pero creo que es posible que puedas resolverlo y manipular una cadena en algunas vistas / funciones de administración. Tendrías que correr con muchísimos privilegios, pero si es absolutamente necesario, no entiendo por qué no puedes resolverlo desde st.text usando algo como esto

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

Como se indicó, TSQL no distingue entre proporcionar el valor predeterminado y no proporcionar un valor. Creo que el motor básicamente sustituye los valores predeterminados por cualquier parámetro faltante (o parámetros llamados con la palabra clave DEFAULT).

En su lugar, use 0 como "No Hat" y NULL como ningún parámetro especificado. Este es el uso preferido de NULL, donde significa valor desconocido o no especificado. Al usar NULL como "No Hat", lo ha cooptado para agregar un valor adicional al rango de su tipo de datos.

Piense en ello en términos del tipo de datos BIT. El tipo de datos se define para representar un valor binario (1 o 0, o T / F si prefiere considerarlo como un valor booleano). Al tratar NULL como un valor válido, ha extendido el tipo de datos más allá de las opciones binarias (ahora tiene tres opciones, 1/0 / NULL.) Mi recomendación es siempre que si encuentra que se han quedado sin valores en el tipo de datos actual, está usando un tipo demasiado pequeño.

Volver a la llamada al procedimiento almacenado; si establece sus valores predeterminados en NULL y trata NULL como no establecido o no especificado, las personas que llaman siempre deben especificar un valor no nulo al llamar al proceso. Si obtiene un NULL, suponga que no proporcionaron un valor, proporcionaron un NULL o utilizaron la palabra clave DEFAULT.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top