stored - Cómo restringir NULL como parámetro al procedimiento almacenado SQL Server?
stored procedure output parameter sql server (3)
¿Es posible crear un procedimiento almacenado como
CREATE PROCEDURE Dummy
@ID INT NOT NULL
AS
BEGIN
END
¿Por qué no es posible hacer algo como esto?
La validación de parámetros no es actualmente una característica de la lógica de procedimientos en SQL Server, y NOT NULL es solo un tipo posible de validación de datos. El tipo de datos CHAR en una tabla tiene una especificación de longitud. ¿Debería implementarse también? ¿Y cómo manejas las excepciones? Existe una metodología extensa, altamente desarrollada y algo basada en estándares para el manejo de excepciones en esquemas de tablas; pero no para la lógica procedimental, probablemente porque la lógica procedimental se define a partir de los sistemas relacionales. Por otro lado, los procedimientos almacenados ya tienen un mecanismo existente para generar eventos de error, vinculados a numerosas API e idiomas. No hay tal soporte para restricciones de tipo de datos declarativos en los parámetros. Las implicaciones de agregarlo son extensas; especialmente porque es bien soportado y extensible, simplemente para agregar el código:
IF ISNULL(@param) THEN
raise error ....
END IF
El concepto de NULL en el contexto de un procedimiento almacenado ni siquiera está bien definido, especialmente si se lo compara con el contexto de una tabla o una expresión SQL. Y no es la definición de Microsoft. Los grupos de estándares SQL han pasado muchos años generando mucha literatura que establece el comportamiento de NULL y los límites de las definiciones para ese comportamiento. Y los procedimientos almacenados no son uno de ellos.
Un procedimiento almacenado está diseñado para ser lo más ligero posible para hacer que el rendimiento de la base de datos sea lo más eficiente posible. Los tipos de datos de los parámetros no están ahí para la validación, sino para permitir que el compilador proporcione al optimizador de consultas mejor información para compilar el mejor plan de consulta posible. Una restricción NOT NULL en un parámetro se dirige hacia abajo en una ruta completa al hacer que el compilador sea más complejo con el nuevo propósito de validar argumentos. Y por lo tanto, menos eficiente y más pesado.
Hay una razón por la cual los procedimientos almacenados no están escritos como funciones de C #.
Puede verificar su NULL-ness en el sproc y RAISERROR
para informar el estado a la ubicación de la llamada.
CREATE proc dbo.CheckForNull @i int
as
begin
if @i is null
raiserror(''The value for @i should not be null'', 15, 1) -- with log
end
GO
Luego llame:
exec dbo.CheckForNull @i = 1
o
exec dbo.CheckForNull @i = null
Su código es correcto, sensato e incluso una buena práctica. Solo necesita esperar SQL Server 2014, que admite este tipo de sintaxis.
Después de todo, ¿por qué capturar en tiempo de ejecución cuando puedes en tiempo de compilación?
Vea también este documento msdn y busque Natively Compiled
allí.
Como dkrez dice, nullabiliy no se considera parte de la definición del tipo de datos. Todavía me pregunto por qué no.