none
PARAMETROS OPCIONALES STORED PROCEDURE RRS feed

  • Pregunta

  • EN EL SIGUIENTE STORED PROCEDURE GUARDO VALORES CON PARAMETROS OPCIONALES SE SUPONE ASI LOS DEBERIA AGREGAR SIN SER OPCIONALES...

    exec nuevatabla 'CHGF','JESUS',NULL,'GARZA','SAUCEDO','JESUS@GMAIL.COM','SOFTWARE ENGINEER','SI',NULL,NULL                 
    GO

    --------------------

    AHORA ... SE SUPONE QUE LOS ULTIMOS DOS PARAMETROS SON OPCIONALES Y SIN INGRESA LOS DATOS AUN SIN COLOCAR UN VALOR... POR EJEMPLO 

    exec nuevatabla 'CHGF','JESUS',NULL,'GARZA','SAUCEDO','JESUS@GMAIL.COM','SOFTWARE ENGINEER','SI'
    GO

    ------------------ HASTA AHORA INGRESA BIEN LOS DATOS HASTA 'SI' --- PERO OJO... EL TERCER PARAMETRO ESOPCIONAL TAMBIEN Y SI EJECUTO ESTO...

    exec nuevatabla 'CHGF','JESUS','GARZA','SAUCEDO','JESUS@GMAIL.COM','SOFTWARE ENGINEER','SI'
    GO
    ----------------ENTONCES ME MARCA EL ERROR 

    Msg 201, Level 16, State 4, Procedure nuevatabla, Line 0
    Procedure or function 'nuevatabla' expects parameter '@LIDER', which was not supplied.

    --------- COSA QUE CON EL EJEMPLO ANTERIOR A ESTE NO PROVOCABA AUN... SABIENDO QUE LOS ULTIMOS DOS PARAMETROS TAMBIEN SON OPCIONALES ... ALGUNA SOLUCION  A ESTO ?

    jueves, 10 de octubre de 2013 21:57

Respuestas

  • Si quieres poner parametros opcionales que no esten al final, obligatoriamente debes llamarlos por su nombre en el execute, fijate en un ejemplo basico

    create procedure miprocedimiento @valor1 int, @valoropcional varchar(50) = NULL, @valor3 bit
    as
    ...

    Lo invocarias asi

    execute miprocedimiento @valor1 = 1, @valor3=0;


    jueves, 10 de octubre de 2013 22:19
  • Dinos como estás llamando al procedimiento. Desde c#? vb.net?.

    Si un parámetro es opcional, y quieres que desde c# o vb.net tome el valor predeterminado que esté declarado en el procedimiento, lo que hay que hacer en c# o vb.net es no añadirlo a la colección de parámetros. Si lo añades a la colección de parámetros y no le das ningún valor, te devolverá un error a no ser que el parámetro esté definido como parámetro de salida o "return" (no como de entrada y salida). Todo parámetro añadido a la colección de parámetros que esté definido como de entrada o de entrada y salida, tienes que establecerle un valor.


    viernes, 11 de octubre de 2013 20:26

Todas las respuestas

  • Si quieres poner parametros opcionales que no esten al final, obligatoriamente debes llamarlos por su nombre en el execute, fijate en un ejemplo basico

    create procedure miprocedimiento @valor1 int, @valoropcional varchar(50) = NULL, @valor3 bit
    as
    ...

    Lo invocarias asi

    execute miprocedimiento @valor1 = 1, @valor3=0;


    jueves, 10 de octubre de 2013 22:19
  • NO ME FUNCIONO TU EJEMPLO RONALD, O TAL VEZ NO LO COMPRENDI MUY BIEN :(

    viernes, 11 de octubre de 2013 13:52
  • Proporciona mas detalles, que significa "no me funciono"? te dio algún error? que mensaje te muestra?
    viernes, 11 de octubre de 2013 14:07
  • DISCULPA, FUNCIONO..... PERO NO COMO NECESITABA, LA UNICA SOLUCION ES MANDAR DESDE EL TEXTBOX LA PROPIEDAD NULL AL PARAMETRO PARA PODER ALMACENARLO COMO NULL, SINO MARCARA ERROR POR EL HECHO DE QUE EL PARAMETRO ESTA AL PRINCIPIO O EN MEDIO, NO COMO SUCEDE CUANDO SE PONEN AL FINAL QUE SE INGRESAN NULL AUTOMATICAMENTE,  OSEA RECORRE LOS PARAMETROS Y MARCA ERRORES QUE SEGURAMENTE YA CONOCES, PERO DE ANTEMANO TE AGRADEZCO MUCHO :)
    viernes, 11 de octubre de 2013 18:18
  • Dinos como estás llamando al procedimiento. Desde c#? vb.net?.

    Si un parámetro es opcional, y quieres que desde c# o vb.net tome el valor predeterminado que esté declarado en el procedimiento, lo que hay que hacer en c# o vb.net es no añadirlo a la colección de parámetros. Si lo añades a la colección de parámetros y no le das ningún valor, te devolverá un error a no ser que el parámetro esté definido como parámetro de salida o "return" (no como de entrada y salida). Todo parámetro añadido a la colección de parámetros que esté definido como de entrada o de entrada y salida, tienes que establecerle un valor.


    viernes, 11 de octubre de 2013 20:26
  • Una pregunta, entiendo el concepto de parametros por default, pero tengo una duda que no me deja dormir, aqui va: el unico beneficio de usar parametros con valor default es no enviar todos los parametros al store procedure, osea escribir solo algunos de los parametros en el code para llamarlo tanto en sql como en mi lenguaje de programacion, en conclusion... solo sirven para escribir menos?.
    Porque yo tranquilamente puedo escribir un store procedure sin parametros con valor default y al llamarlo indicar todos los parametros que este requiera y solo los parametros que no voy a utilizar enviarle NULL. Acaso no es lo mismo pero escribiendo mas?

    Muchas gracias por leerme.

    domingo, 5 de marzo de 2017 15:36
  • jcaeva,

    Un valor por defecto es un valor pre-definido, pre-existente que se establece bajo algún criterio -por lo general- de usabilidad, y claro, los beneficios de la usabilidad permiten agilizar las tareas reduciendo la pérdida de tiempo.

    Cuando defines un valor por defecto para un parámetro puedes invocar el procedimiento almacenado sin indicar un valor para el parámetro, considera que un valor por defecto no sólo es NULL, también puede ser una constante, por ejemplo:

    CREATE PROCEDURE dbo.NombreProcedimiento
        @Nombre nvarchar(50) = N'%'
    AS   
    BEGIN
        SET NOCOUNT ON;  
    
        SELECT Nombre, Apellido, Edad
        FROM dbo.NombreTabla
        WHERE Nombre LIKE @Nombre;
    END
    GO

    ¿Quieres obtener todas las filas de la tabla?, entonces no tienes necesidad de indicar un valor para el parámetro @Nombre.

    ¿Quieres obtener todas las filas donde el valor de la columna [Nombre] inicie con el carácter E?, entonces envías el valor 'E%' para el parámetro @Nombre.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 5 de marzo de 2017 16:26
  • Williams Morales.

    Ahora entiendo, lo que pasa es que yo lo veia como si el valor del parametro por defecto siempre fuese NULL, en esa situacion mi razonamiento seria correcto, no te parece?.

    Siempre en mi ambito de trabajo los parametros por defecto tienen valor NULL, estaba mas enfocado a ese contexto, por ende, enviar un NULL a un parametro sin valor por defecto "O" dejar de enviar un valor a un parametro con valor por defecto NULL me daba lo mismo, que en realidad es lo mismo.

    Me deje entender?

    Muchas gracias por tu respuesta.

    domingo, 5 de marzo de 2017 17:16
  • jcaeva,

    Bajo el contexto del caso que mencionas claro que es lo mismo. Puedes evitar escribir valores por defecto a los parámetros del procedimiento almacenado y en la invocación establecer un valor para cada uno de los parámetros (incluso NULL), o puedes establecer para algunos  -o todos los parámetros- un valor por defecto y en la invocación establecer un valor para todos los parámetros obligatorios y -en caso se requiera- un valor para los parámetros opcionales, claro, distinto al valor por defecto. Sin embargo, si SQL Server permite escribir procedimientos almacenados con parámetros opcionales, ¿por qué despreciar su uso?



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 5 de marzo de 2017 18:25
  • Comprimiendo la idea, la cita seria: "A los parametros de un procedimiento almacenado que tengan un valor por defecto, no hace ningun sentido enviarles como valor el mismo que ya tiene por defecto, ya que viene siendo lo mismo. Si usas un parametro sin valor por defecto estas obligado a enviarle un valor lo uses o no, pero si usas un parametro con valor por defecto, no estas obligado a enviar uno sino lo necesitas".

    Como adicional en otros foros de internet comentan que los valores por defecto salieron en SQL 2000 y que se crearon con la idea de evitar crear multiples procedimientos almacenados, cosa que para mi no tiene ningun sentido y que confunde mas en vez de ayudar, al menos eso me paso.

    Gracias Williams, que bueno que haya gente que sepa bastante pero que genial que lo comparta, que sigas aprendiendo mucho mas con cero esfuerzo :)

    Saludos.


    • Editado jcaeva domingo, 5 de marzo de 2017 22:07
    domingo, 5 de marzo de 2017 22:03
  • Buen día estimado.

    El uso de los parámetros en dafault tiene varias funciones y beneficios, una de las que creo es la mejor es por mantenimiento.

    Supongamos que tienes un store que calcula la comisión por ventas de los vendedores para una sucursal dada, a este store lo llamas unas 50 veces dentro de todo tu sistema, ya sea desde base de datos u otros sistemas de programación.

    Para que cierre el ejemplo te comento que este store se llama desde el sistema de cada sucursal.

    Supongamos ahora que te dicen que las ventas que se realicen de determinada sucursal tiene un 15% más de comisión, pero tu store no recibe la sucursal como parámetro, ¿Como podemos arreglar esto??

    Una solución es agregar este nuevo parámetro en el store y cambiar en las 50 sucursales donde se llama al mismo, esto puede ser un trabajo de varias horas.

    Otra solución es agregar el parámetro con un valor por defecto, ejemplo null, y solo cambias el store en el sistema de la sucursal a la cual se le debe cambiar el valor de la comisión, en este caso agregas la sucursal al sotre.

    ¿Que genera esto? en el store con un simple IF preguntas si  el parámetro sucursal es null, si es null usas el valor por defecto de la comisión, de lo contrario preguntas el valor de la comisión según la sucursal.

    Esta última solución te ahorra varias horas de trabajo.

    Espero que haya sido claro el ejemplo.

    Saludos

    miércoles, 3 de enero de 2018 12:19