none
Concatenar campos de una misma tabla RRS feed

  • Pregunta

  • Amigos buenas noches , me podrian ayudar  , como puedo concatenar dos campo de la misma tabla , resulta que en esta consulta muevo un correlativo segun  el Fliedname   y funciona perfectamenta  pero tambien que debo  mover  fieldname cuando sea igual a lencorrel    para que me agregue un cero al numero correlativo fieldname= prxprof  intenten concatenar @Long antes de numbase pero no funciono , por ejemp prxprof me trae 40327 pero deben ser 6 digitos entonces debe evaluar en lencorrel y trae el valor de este que 0 y agregarlo al inicio  para que quede asi 040327, espero me puedan ayudar.

    Create proc insertarNumeroPedido] ON TlbPedidos
    instead of insert
    AS
    SET XACT_ABORT ON
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    DECLARE @TABLE TABLE ( Pedido int,
    Remision varchar(MAX),
      CodClie varchar(15),
      SolicitaP varchar(50),
      UsurIngreso nvarchar(20),
      FechaCirugia datetime,
      FechaCompromiso datetime,
      Diagnostico varchar(100),
      Profesional varchar(100),
      Recibe varchar(50),
      SSoporte int ,
      SPiezaMano int ,
      SFisioDespenser int ,
      Perforador int ,
      SReciprocante int ,
      SOscilanteMax int ,
      SOscilanteOrt int ,
      SSet int ,
      MateriaSolicitado nvarchar(500),
      Comentarios nvarchar(500),
      IdPedidos int,
      Paciente varchar(50),
      TypeID int,
      NumeroDoc nvarchar(50),
      Instrumentador varchar(100),
      Motivo varchar(200),
      IDEstado nvarchar(10)
    );

    DECLARE @Long INT,
    @Prx INT
    SET @Long = (SELECT ValueInt FROM dbo.SACORRELSIS WHERE FieldName = 'LenCorrel')
    SET @Prx = (SELECT ValueInt FROM dbo.SACORRELSIS WHERE FieldName = @FieldName)

                        
    @REGS int = (Select ISNULL(MAX(ValueInt),0) NumBase FROM  SACORRELSIS where FieldName ='PrxProf');
    ;WITH CTE AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS FILA
    FROM inserted
    ), Regs AS
    (
    SELECT @REGS AS NumBase
    )
    INSERT INTO @TABLE 
    Select c.fila+r.NumBase as Pedido, C.Remision, C.CodClie,c.SolicitaP, C.UsurIngreso,c.FechaCirugia,c.FechaCompromiso,c.Diagnostico,
    c.Profesional,c.Recibe,c.SSoporte,c.SPiezaMano,c.SFisioDespenser,c.Perforador,c.SReciprocante,c.SOscilanteMax,c.SOscilanteOrt,
    c.SSet,c.MateriaSolicitado,c.Comentarios,c.IdPedidos,c.Paciente,c.TypeID,c.NumeroDoc,c.Instrumentador,c.Motivo,c.IDEstado
    from cte c
    cross join Regs  R;

    UPDATE SACORRELSIS SET ValueInt = @REGS + (SELECT COUNT(*) FROM @TABLE)where FieldName='PrxProf';

    INSERT INTO TlbPedidos
    SELECT * FROM @TABLE;


    Daniel

    jueves, 4 de junio de 2020 2:40

Respuestas

  • Hola Dannycv012: 

    Yo veo un problema. Y solo uno.

    declare @a int;
    set @a = 5;
    select concat(0,@a)

    Esta claro que esto es lo que quieres.

    Pero fíjate, que una cosa es que yo devuelva una select concatenando un 0 a un int = 5 cuyo resultado es 05. 

    declare @a int;
    set @a = 5;
    declare @resultado int;
    -- Asigno al resultado la expresión anterior
    select @resultado =  concat(0,@a);
    
    -- Lo visualizo
    select @resultado

    Ahora el resultado no es 05, porque @resultado es de tipo entero, por tanto los ceros a la izquierda no existen.

    UPDATE SACORRELSIS SET ValueInt =

    Esa columna tiene pinta de ser un int. Si es un int, da igual lo que hagas, porque el Sql server te va a convertir implicitamente en un int, aunque el varchar contenga 05.


    jueves, 4 de junio de 2020 15:48

Todas las respuestas

  • Hola Dannycv012:

    Lo primero, en la definición has puesto un create procedure, pero acompañado de la definición de un trigger

    Create proc insertarNumeroPedido] ON TlbPedidos instead of insert

    Algo no encaja. Será Create Trigger?

    Si utilizas un trigger tipo instead of para la tabla pedidos, luego tienes que realizar el insert en pedidos, porque sino nunca tendrás ningún registro en pedidos.

    Trigger instead of

    https://javifer2.wordpress.com/2020/05/03/trigger-que-es-como-se-hace-y-como-funciona-instead-of/

    Trigger after insert

    https://javifer2.wordpress.com/2020/04/12/trigger-que-es-como-se-hace-y-como-funciona-after-for-insert/

    Luego en el código utilizas @FieldName que no has definido.

    Por otro lado no puedes poner un cero por delante en @Long porque es una variable de tipo int.

    Entiendo que el objetivo final es cambiar la columna ValueInt de la tabla SACARRELSIS con el numero correlativo. Pero el nombre de la columna sugiere que es un INT, y estaríamos igual.

    No obstante suponiendo que sea un varchar e imaginando que fuese en la update donde quieres grabar ese 0 por delante.

    UPDATE SACORRELSIS SET ValueInt = 
    -- IMAGINO QUE QUIERES PONER UN 0 AQUÍ POR DELANTE EN FUNCIÓN DE ALGUNA EXPRESIÓN
    CASE WHEN LEN (@REGS +  (SELECT COUNT(*) FROM @TABLE)) = 5 THEN 
    -- LA EXPRESIÓN ES IGUAL A 5 ENTONCES LE ANEXO UN CERO POR DELANTE CONVIRTIENDO TODO LO QUE HAY POR DETRÁS A VARCHAR
    		CONCAT ('0',CAST((@REGS +  (SELECT COUNT(*) FROM @TABLE)) AS VARCHAR(5))
    	ELSE
    -- SI NO ES IGUAL A 5 ENTONCES SIMPLEMENTE LO CONVIERTO A VARCHAR
    		CAST(
    		( @REGS + 
    		(SELECT COUNT(*) FROM @TABLE)) AS VARCHAR(6)) END
    where FieldName='PrxProf';


     

    jueves, 4 de junio de 2020 3:30
  • si javier es un trigger me equivo que  , Discupa  resulta que utilizo lo recomendado pero no me agrega el cero  la idea es que seleccione el valor numero correlativo  y me traiga el cero concatenado 

    ALTER  TRIGGER [dbo].[insertarNumeroPedido] ON [dbo].[TlbPedidos]
    instead of insert
    AS
    SET XACT_ABORT ON
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    DECLARE @TABLE TABLE ( Pedido int,
    Remision varchar(MAX),
      CodClie varchar(15),
      SolicitaP varchar(50),
      UsurIngreso nvarchar(20),
      FechaCirugia datetime,
      FechaCompromiso datetime,
      Diagnostico varchar(100),
      Profesional varchar(100),
      Recibe varchar(50),
      SSoporte int ,
      SPiezaMano int ,
      SFisioDespenser int ,
      Perforador int ,
      SReciprocante int ,
      SOscilanteMax int ,
      SOscilanteOrt int ,
      SSet int ,
      MateriaSolicitado nvarchar(500),
      Comentarios nvarchar(500),
      IdPedidos int,
      Paciente varchar(50),
      TypeID int,
      NumeroDoc nvarchar(50),
      Instrumentador varchar(100),
      Motivo varchar(200),
      IDEstado nvarchar(10)
    );
    DECLARE 

    @REGS int = (Select ISNULL(MAX(ValueInt),0) NumBase FROM  SACORRELSIS where FieldName ='PrxProf');
    ;WITH CTE AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS FILA
    FROM inserted
    ), Regs AS
    (
    SELECT @REGS AS NumBase
    )
    INSERT INTO @TABLE 
    Select c.fila+r.NumBase as Pedido, C.Remision, C.CodClie,c.SolicitaP, C.UsurIngreso,c.FechaCirugia,c.FechaCompromiso,c.Diagnostico,
    c.Profesional,c.Recibe,c.SSoporte,c.SPiezaMano,c.SFisioDespenser,c.Perforador,c.SReciprocante,c.SOscilanteMax,c.SOscilanteOrt,
    c.SSet,c.MateriaSolicitado,c.Comentarios,c.IdPedidos,c.Paciente,c.TypeID,c.NumeroDoc,c.Instrumentador,c.Motivo,c.IDEstado
    from cte c
    cross join Regs  R;

    UPDATE SACORRELSIS SET ValueInt = 
    -- IMAGINO QUE QUIERES PONER UN 0 AQUÍ POR DELANTE EN FUNCIÓN DE ALGUNA EXPRESIÓN
    CASE WHEN LEN (@REGS +  (SELECT COUNT(*) FROM @TABLE)) = 5 THEN 
    -- LA EXPRESIÓN ES IGUAL A 5 ENTONCES LE ANEXO UN CERO POR DELANTE CONVIRTIENDO TODO LO QUE HAY POR DETRÁS A VARCHAR
    CONCAT ('0',CAST((@REGS +  (SELECT COUNT(*) FROM @TABLE)) AS VARCHAR(5))
    ELSE
    -- SI NO ES IGUAL A 5 ENTONCES SIMPLEMENTE LO CONVIERTO A VARCHAR
    CAST(
    ( @REGS + 
    (SELECT COUNT(*) FROM @TABLE)) AS VARCHAR(6)) END
    where FieldName='PrxProf';

    INSERT INTO TlbPedidos
    SELECT * FROM @TABLE;


    Daniel



    • Editado Dannycv012 jueves, 4 de junio de 2020 14:20
    jueves, 4 de junio de 2020 14:04
  • Hola Dannycv012: 

    Yo veo un problema. Y solo uno.

    declare @a int;
    set @a = 5;
    select concat(0,@a)

    Esta claro que esto es lo que quieres.

    Pero fíjate, que una cosa es que yo devuelva una select concatenando un 0 a un int = 5 cuyo resultado es 05. 

    declare @a int;
    set @a = 5;
    declare @resultado int;
    -- Asigno al resultado la expresión anterior
    select @resultado =  concat(0,@a);
    
    -- Lo visualizo
    select @resultado

    Ahora el resultado no es 05, porque @resultado es de tipo entero, por tanto los ceros a la izquierda no existen.

    UPDATE SACORRELSIS SET ValueInt =

    Esa columna tiene pinta de ser un int. Si es un int, da igual lo que hagas, porque el Sql server te va a convertir implicitamente en un int, aunque el varchar contenga 05.


    jueves, 4 de junio de 2020 15:48
  • Hola

      

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las respuestas proporcionadas?  

     

    Gracias por usar los foros de MSDN. 

      

    viernes, 5 de junio de 2020 14:51
    Moderador