none
Procedimiento almacenado en T-SQL

    Question

  • Hola,

    Hay forma de realizar un procedimiento almacenado que primero verifique si existe los datos en una tabla y que actualice o inserte segun lo verificado. Tengo lo siguiente pero no me funciona, agradecería mucho que me dieran ejemplos prácticos porque apenas estoy empezando con T-SQL.

    ALTER PROCEDURE [dbo].[IngresarItem] 
    AS
    IF NOT EXISTS(SELECT Nombre FROM tItems WHERE Nombre + Serial IN (SELECT Hostname + SerialNumber FROM tempDSM))
    BEGIN
    INSERT INTO tItems (Nombre,Serial,ID_Software,Instalado,Legalizado) SELECT tempDSM.Hostname, tempDSM.SerialNumber, tSoftware.ID,'True','False'
    FROM tempDSM INNER JOIN tSoftware ON tempDSM.SoftwareInve_Title = tSoftware.[Nombre detectado] 
    END
    ELSE
    UPDATE tItems SET Instalado='True' WHERE Nombre + Serial IN (SELECT Hostname + SerialNumber FROM tempDSM)
    
    
    
    
    
    



    Hector Alexander Restrepo Jimenez www.wix.com/alexrestrej/alexrestrej
    Tuesday, January 25, 2011 7:08 PM

Answers

  • Prueba

    ALTER PROCEDURE [dbo].[IngresarItem]
    AS

    DECLARE @NUMREG INT

    SELECT Nombre FROM tItems WHERE Nombre + Serial IN (SELECT Hostname + SerialNumber FROM tempDSM))

    SET @NUMREG =(SELECT @@ROWCOUNT )


    IF (@NUMREG =0)
    BEGIN
    INSERT INTO tItems (Nombre,Serial,ID_Software,Instalado,Legalizado) SELECT tempDSM.Hostname, tempDSM.SerialNumber, tSoftware.ID,'True','False'
    FROM tempDSM INNER JOIN tSoftware ON tempDSM.SoftwareInve_Title = tSoftware.[Nombre detectado]
    END
    ELSE
    UPDATE tItems SET Instalado='True' WHERE Nombre + Serial IN (SELECT Hostname + SerialNumber FROM tempDSM)


    Rolando Lau Project Management
    • Proposed as answer by Rolando Lau Tuesday, January 25, 2011 7:27 PM
    • Marked as answer by alexrestrej Tuesday, January 25, 2011 7:31 PM
    • Unmarked as answer by alexrestrej Tuesday, January 25, 2011 7:31 PM
    • Marked as answer by alexrestrej Tuesday, January 25, 2011 7:35 PM
    Tuesday, January 25, 2011 7:26 PM

All replies

  • Prueba

    ALTER PROCEDURE [dbo].[IngresarItem]
    AS

    DECLARE @NUMREG INT

    SELECT Nombre FROM tItems WHERE Nombre + Serial IN (SELECT Hostname + SerialNumber FROM tempDSM))

    SET @NUMREG =(SELECT @@ROWCOUNT )


    IF (@NUMREG =0)
    BEGIN
    INSERT INTO tItems (Nombre,Serial,ID_Software,Instalado,Legalizado) SELECT tempDSM.Hostname, tempDSM.SerialNumber, tSoftware.ID,'True','False'
    FROM tempDSM INNER JOIN tSoftware ON tempDSM.SoftwareInve_Title = tSoftware.[Nombre detectado]
    END
    ELSE
    UPDATE tItems SET Instalado='True' WHERE Nombre + Serial IN (SELECT Hostname + SerialNumber FROM tempDSM)


    Rolando Lau Project Management
    • Proposed as answer by Rolando Lau Tuesday, January 25, 2011 7:27 PM
    • Marked as answer by alexrestrej Tuesday, January 25, 2011 7:31 PM
    • Unmarked as answer by alexrestrej Tuesday, January 25, 2011 7:31 PM
    • Marked as answer by alexrestrej Tuesday, January 25, 2011 7:35 PM
    Tuesday, January 25, 2011 7:26 PM
  • Gacias Rolando, asi funciona.

     

    Otra duda ¿Se puede ejecutar varias instrucciones en un procedimiento almacenado?

    ¿algo asi?

    IF (@NUMREG =0)
    BEGIN
    <ConsultaSQL>
    END
    ELSE

    <OtraConsultaSQL>

    ELSE

    <ConsultaSQL>

     

     


    Hector Alexander Restrepo Jimenez www.wix.com/alexrestrej/alexrestrej
    Tuesday, January 25, 2011 7:35 PM
  • Seria :
    No pueden haber "2 de lo contrario"

    Seria de esta manera

    IF (@NUMREG =0)
    BEGIN
    <ConsultaSQL>
    END
    ELSE
    BEGIN
      IF <CONDICION>
        BEGIN
        <OtraConsultaSQL>
        END
      ELSE
        BEGIN
        <ConsultaSQL>
        END
    END

    OJO : tu consulta funcionara pero cuando mas datos tengas mas lento sera el proceso , ya que estas leyendo toda una tabla e inclusive haciendo una subconsulta. te aconsejo que uses algunos parametros , preguntar por el codigo por ejemplo en lugar de barrer toda la tabla.

    saludos


    Rolando Lau Project Management
    Tuesday, January 25, 2011 7:51 PM
  • --Se actualiza el registro suponiendo que existe

    UPDATE

     

    tItems SET Instalado='True' WHERE Nombre + Serial IN (SELECT Hostname + SerialNumber FROM tempDSM)

    --Si acaso no existiera el registro se inserta.

    IF

     

    @@ROWCOUNT = 0

     

    BEGIN

     

    INSERT INTO tItems (Nombre,Serial,ID_Software,Instalado,Legalizado)

     

    SELECT tempDSM.Hostname, tempDSM.SerialNumber, tSoftware.ID,'True','False'

     

    FROM tempDSM INNER JOIN tSoftware ON tempDSM.SoftwareInve_Title = tSoftware.[Nombre detectado]

     

    END

    Tuesday, January 25, 2011 8:53 PM