none
Validacion para convertir valor NULL a EN BLANCO dentro de trigger RRS feed

  • Pregunta

  • Hola! Buenas tardes, 

    Realicé un trigger en SQL que busca un valor de un campo en otras tablas de mi base de datos y lo trae de regreso en una tabla en especifico cada vez que se agrega un registro. 

    Pregunta: Se puede realizar una validación dentro de este trigger que cuando no encuentre el valor buscado dentro de las otras tablas, se ingrese "en blanco" en lugar de "NULL". 

    Espero me puedan echar una mano. 

    ALTER TRIGGER [dbo].[Id_Benef]
        ON [dbo].[Compromiso]
        AFTER INSERT
    AS
    BEGIN
        UPDATE c    
        SET 
      c.Id_emisor_altaben = b.Id_beneficiario,
      c.Id_empresa = o.Id_empresa
        FROM
      inserted i
      INNER JOIN Compromiso c ON (i.emisor_RFC = c.emisor_RFC)
     AND (i.recep_RFC = c.recep_RFC)
      INNER JOIN Beneficiarios_RFC_ID b ON (c.emisor_RFC = b.RFC_beneficiario)
     AND (c.recep_RFC = b.RFC_empresa)
    LEFT JOIN OPERACION_PLE_PME_PQU.dbo.Empresas o ON (i.recep_RFC = o.RFC)
    END

    Gracias!

    miércoles, 19 de octubre de 2016 21:55

Respuestas

  • Nalle Ortiz,

    ¿Tienes alguna razón para persistir un caracter de longitud 0 en vez de NULL? 

    ALTER TRIGGER [dbo].[Id_Benef]
        ON [dbo].[Compromiso]
        AFTER INSERT
    AS
    BEGIN
        UPDATE c    
        SET 
    	   c.Id_emisor_altaben = ISNULL(b.Id_beneficiario, '')
    	   c.Id_empresa = ISNULL(o.Id_empresa, '')
        FROM
    	   inserted i
    	   INNER JOIN Compromiso c ON (i.emisor_RFC = c.emisor_RFC)
    		  AND (i.recep_RFC = c.recep_RFC)
    	   INNER JOIN Beneficiarios_RFC_ID b ON (c.emisor_RFC = b.RFC_beneficiario)
    		  AND (c.recep_RFC = b.RFC_empresa)
    	   LEFT JOIN OPERACION_PLE_PME_PQU.dbo.Empresas o ON (i.recep_RFC = o.RFC)
    END


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 19 de octubre de 2016 22:05
  • es muy probable que el problema esté en el inner join que tienes con beneficiarios,
    ALTER TRIGGER [dbo].[Id_Benef]
        ON [dbo].[Compromiso]
        AFTER INSERT
    AS
    BEGIN
        UPDATE c    
        SET 
    	   c.Id_emisor_altaben = ISNULL(b.Id_beneficiario, /*''*/ 0)
    	   c.Id_empresa = ISNULL(o.Id_empresa, /*''*/ 0)
        FROM
    	   inserted i
    	   INNER JOIN Compromiso c ON (i.emisor_RFC = c.emisor_RFC)
    		  AND (i.recep_RFC = c.recep_RFC)
    	  /* INNER  */ LEFT  JOIN Beneficiarios_RFC_ID b ON (c.emisor_RFC = b.RFC_beneficiario)
    		  AND (c.recep_RFC = b.RFC_empresa)
    	   LEFT JOIN OPERACION_PLE_PME_PQU.dbo.Empresas o ON (i.recep_RFC = o.RFC)
    END
    También veras que he tomado en consideración que si son de tipo de datos int... no pueden tener blancos o son nulos o son cero, pero no son blancos

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA



    jueves, 20 de octubre de 2016 0:41
    Moderador

Todas las respuestas

  • Nalle Ortiz,

    ¿Tienes alguna razón para persistir un caracter de longitud 0 en vez de NULL? 

    ALTER TRIGGER [dbo].[Id_Benef]
        ON [dbo].[Compromiso]
        AFTER INSERT
    AS
    BEGIN
        UPDATE c    
        SET 
    	   c.Id_emisor_altaben = ISNULL(b.Id_beneficiario, '')
    	   c.Id_empresa = ISNULL(o.Id_empresa, '')
        FROM
    	   inserted i
    	   INNER JOIN Compromiso c ON (i.emisor_RFC = c.emisor_RFC)
    		  AND (i.recep_RFC = c.recep_RFC)
    	   INNER JOIN Beneficiarios_RFC_ID b ON (c.emisor_RFC = b.RFC_beneficiario)
    		  AND (c.recep_RFC = b.RFC_empresa)
    	   LEFT JOIN OPERACION_PLE_PME_PQU.dbo.Empresas o ON (i.recep_RFC = o.RFC)
    END


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 19 de octubre de 2016 22:05
  • Solo una consideración, si tuvieras integridad referencial en tu tabla Compromiso, por los campos idempresa e id_emisor_altaben, el trigger no te funcionaría poniendo blancos.

    el motivo es claro, para que te funcione o bien es nulo o bien existe el equivalente en la tabla "empresas" o en la tabla "emisores"


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    miércoles, 19 de octubre de 2016 22:49
    Moderador
  • Si, ya que me está causando problemas en otra herramienta que uso, cuando es un valor NULL lo pone como "none". en vez de nada. 

    Acabo de probarlo como me mencionaste, pero no funciona no cambia el valor de NULL a en blanco.

    Gracias

    miércoles, 19 de octubre de 2016 23:21
  • Aunque es un buen punto a considerar, creo que no tiene una tabla referenciada dentro de la misma base de datos (por eso consulta el valor contra una tabla de otra base de datos), si es así no existe referencia, sin embargo -y ahora que me fijo recién en la imagen adjunta- es posible que el tipo de dato (de las columnas a actualizar) sean de un tipo numérico y entonces la asignación "incorrecta" de un caracter de longitud 0 será en vano ya que será convertido a 0.

    En cualquier caso, habrá que esperar el feed-back de Nalle Ortiz.

    miércoles, 19 de octubre de 2016 23:29
  • Si, ya que me está causando problemas en otra herramienta que uso, cuando es un valor NULL lo pone como "none". en vez de nada. 

    Acabo de probarlo como me mencionaste, pero no funciona no cambia el valor de NULL a en blanco.

    Gracias

    Recién es que leo tu comentario. 

    ¿Qué tipo de dato tienen las columnas 'id_beneficiario', 'id_matricula'?. Si tienen un tipo de dato numérico se convertirá a 0, en cambio si es un tipo de dato que permite valores alfanuméricos (varchar, nvarchar, etc.) entonces no veo porque no persistiría un caracter de longitud 0 ('').

    Por otro lado, considera que los datos de presentación los debes manejar en el lado del cliente (UI) o en casos estrictos desde la consulta de selección, algo como:

    /*Si Col3 es de tipo varchar*/
    SELECT Col1, Col2, ISNULL(Col3, ''), Col4 FROM ...
    
    /*Si Col3 es de tipo numérico*/
    SELECT Col1, Col2, ISNULL(CONVERT(varchar(10), Col3), ''), Col4 FROM ...

    Sin embargo, en caso la columna sea de un tipo numérico "forzar" la conversión a cadena para soportar el caracter de longitud cero ('') lo veo incorrecto, te sugiero revises la forma de enmascarar desde el cliente (UI) los valores NULL.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 19 de octubre de 2016 23:40
  • es muy probable que el problema esté en el inner join que tienes con beneficiarios,
    ALTER TRIGGER [dbo].[Id_Benef]
        ON [dbo].[Compromiso]
        AFTER INSERT
    AS
    BEGIN
        UPDATE c    
        SET 
    	   c.Id_emisor_altaben = ISNULL(b.Id_beneficiario, /*''*/ 0)
    	   c.Id_empresa = ISNULL(o.Id_empresa, /*''*/ 0)
        FROM
    	   inserted i
    	   INNER JOIN Compromiso c ON (i.emisor_RFC = c.emisor_RFC)
    		  AND (i.recep_RFC = c.recep_RFC)
    	  /* INNER  */ LEFT  JOIN Beneficiarios_RFC_ID b ON (c.emisor_RFC = b.RFC_beneficiario)
    		  AND (c.recep_RFC = b.RFC_empresa)
    	   LEFT JOIN OPERACION_PLE_PME_PQU.dbo.Empresas o ON (i.recep_RFC = o.RFC)
    END
    También veras que he tomado en consideración que si son de tipo de datos int... no pueden tener blancos o son nulos o son cero, pero no son blancos

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA



    jueves, 20 de octubre de 2016 0:41
    Moderador
  • Hola buenas noches.

    Disculpen la demora al contestar. Les agradezco mucho a los 2, me han ayudado bastante. Ya pude realizar lo que queria, en este caso mis campos son varchar, por lo tanto, se pudo agregar valor en blanco (''). 

    viernes, 21 de octubre de 2016 4:50
  • Gracias Miguel Egea, me ha ayudado bastante y una disculpa por la demora en contestar, es solo que no había visto el mensaje. 

    Mil gracias!

    viernes, 21 de octubre de 2016 4:51