none
Uso de substring para formar una palabra RRS feed

  • Pregunta

  • Buen dia tengo un procedimiento para actualizar datos en SQL SERVER 2014 en el cual trato de hacer uso del comando substring para que a partir de lo que hay en un campo  llene otro campo pero sale error pues no creo estar usando correctamente la funcion si me pudieran decir que esta mal en la sintaxis o si hay otra manera de hacer lo que busco que basicamente es que si en la columna codigo el codigo empieza con C en la columna puerto de la misma tabla el procedimiento ponga 5 en esa columna. Tambien si hay una forma de poner en el procedimiento que si la columna codigo se actualizo entonces en el campo fechaactualizacion  un getdate. Cualquier sugerencia me sera de mucha ayuda.

    declare @Codigo varchar(9)
    if (select substring (@Codigo,1,1)='F')
    set @Puerto=5
    create procedure Actualizar(@ID INT, @serialID int,@codigo char(12),@puerto INT)
    as 
    begin 
    if EXISTS (select* from Trabajo where ID=@ID)
    begin 
    update Trabajo
    set 
    serialID = @serialID,
    codigo = @codigo,
    puerto= @puerto
    where ID =@ID
    end
    else if NOT EXISTS (select* from Trabajo where ID=@ID)
    PRINT 'Este registro aun no existe'
    end
    go




    • Editado AlexP5 martes, 8 de agosto de 2017 16:38
    martes, 8 de agosto de 2017 15:21

Respuestas

  • Hola, que tal.

    Para la primera parte del substring puede ser así:

    declare @Codigo varchar(9)
    declare @Puerto int
    
    Set @codigo = 'F00000000'
    
    if (select substring(@Codigo,1,1)) ='C' 
    	set @Puerto=5;
    ELSE 
    	set @Puerto = 1;

    Para la otra parte, deberías utilizar un Trigger que detect el Update en la columna Código de esa tabla y realice una actualización con getdate():

    CREATE TRIGGER [dbo].[TR_CODIGO_UPDATE]
           ON [dbo].[TABLE_NAME]
    AFTER UPDATE
    AS
    BEGIN
           SET NOCOUNT ON;
     
           UPDATE TABLE_NAME  SET FECHAUPD = GETDATE()
    	   WHERE codigo = (SELECT @codigo = INSERTED.CodigoId FROM INSERTED ) 	   
    END

    Saludos


    Mariano K.

    • Marcado como respuesta AlexP5 martes, 8 de agosto de 2017 16:44
    martes, 8 de agosto de 2017 15:59
  • Pienso que la aplicación debe ser la responsable de enviar los datos tal y como se espera sean almacenados, si por alguna razón no puedes hacerlo o no tienes el control del código de la aplicación recién es que se sustenta desplegar la lógica en un procedimiento almacenado, que entiendo debería tener similar resolución a lo siguiente:

    UPDATE dbo.NombreTabla
    SET
        Codigo = @Codigo,
        Puerto = CASE WHEN LEFT(@Codigo, 1) = 'F' THEN 5 ELSE Puerto END,
        FechaActualizacion = CASE WHEN Codigo <> @Codigo THEN GETDATE() 
    						  ELSE FechaActualizacion END
    WHERE
        id = @id
    GO



    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta AlexP5 martes, 8 de agosto de 2017 16:44
    martes, 8 de agosto de 2017 16:23

Todas las respuestas

  • Pudieras postear el codigo de tu procedimiento?

    No sabemos como realizas la actualizacion, si en masa o para una fila en espcifico.




    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    martes, 8 de agosto de 2017 15:43
  • Hola, que tal.

    Para la primera parte del substring puede ser así:

    declare @Codigo varchar(9)
    declare @Puerto int
    
    Set @codigo = 'F00000000'
    
    if (select substring(@Codigo,1,1)) ='C' 
    	set @Puerto=5;
    ELSE 
    	set @Puerto = 1;

    Para la otra parte, deberías utilizar un Trigger que detect el Update en la columna Código de esa tabla y realice una actualización con getdate():

    CREATE TRIGGER [dbo].[TR_CODIGO_UPDATE]
           ON [dbo].[TABLE_NAME]
    AFTER UPDATE
    AS
    BEGIN
           SET NOCOUNT ON;
     
           UPDATE TABLE_NAME  SET FECHAUPD = GETDATE()
    	   WHERE codigo = (SELECT @codigo = INSERTED.CodigoId FROM INSERTED ) 	   
    END

    Saludos


    Mariano K.

    • Marcado como respuesta AlexP5 martes, 8 de agosto de 2017 16:44
    martes, 8 de agosto de 2017 15:59
  • Pienso que la aplicación debe ser la responsable de enviar los datos tal y como se espera sean almacenados, si por alguna razón no puedes hacerlo o no tienes el control del código de la aplicación recién es que se sustenta desplegar la lógica en un procedimiento almacenado, que entiendo debería tener similar resolución a lo siguiente:

    UPDATE dbo.NombreTabla
    SET
        Codigo = @Codigo,
        Puerto = CASE WHEN LEFT(@Codigo, 1) = 'F' THEN 5 ELSE Puerto END,
        FechaActualizacion = CASE WHEN Codigo <> @Codigo THEN GETDATE() 
    						  ELSE FechaActualizacion END
    WHERE
        id = @id
    GO



    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta AlexP5 martes, 8 de agosto de 2017 16:44
    martes, 8 de agosto de 2017 16:23
  • create procedure Actualizar(@ID INT, @serialID int,@codigo char(12)='TBD',@puerto INT)
    as
    begin
    if EXISTS (select* from Trabajo where ID=@ID)
    begin
    update Trabajo
    set
    serialID = @serialID,
    codigo = @codigo,
    puerto= @puerto
    where ID =@ID
    end
    else if NOT EXISTS (select* from Trabajo where ID=@ID)
    PRINT 'Este registro aun no existe'
    end
    go
    martes, 8 de agosto de 2017 16:38
  • Actualizando la propuesta según el código que adjuntas:

    UPDATE Trabajo
    SET 
        serialID = @serialID,
        codigo = @codigo,
        puerto= CASE WHEN LEFT(@Codigo, 1) = 'F' THEN 5 ELSE @puerto END,
        fechaactualizacion = CASE WHEN Codigo <> @Codigo THEN GETDATE() 
    						  ELSE FechaActualizacion END
    WHERE ID = @ID
    GO


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    martes, 8 de agosto de 2017 16:57