none
¿Cómo copiar la columna id (int e identity) a otra columna de la misma tabla? RRS feed

  • Pregunta

  • Hola comunidad. Espero me puedan ayudar.

    Estoy tratando de crear un Trigger en una tabla llamada Comanda, con una columna llamada idComanda (de tipo int con la característica identity siendo esta la PK de la tabla) y quiero que este atributo, que se crea automáticamente cuando se insertan los demás datos esperados en la tabla, sea copiado o se cree un valor igual al de idComanda (no sé si me explico) a otra columna de la misma tabla llamada ComandaNo (Número de Comanda), con valores similares como que es de tipo int y no puede ser nula.

    Ya he intentado creando algunos códigos pero a la hora de insertar datos en la tabla el código creado no actúa como lo esperado.

    martes, 23 de octubre de 2018 5:17

Respuestas

  • Hola Arón Sánz:

    Te voy a dejar un ejemplo de como hacerlo con un procedimiento almacenado. No es que no se pueda hacer con un trigger, que es bastante sencillo, es que no tiene lógica hacerlo con un trigger, cuando puedes hacerlo de otro modo, ya que si ocurre un problema, no tienes constancia de ello, sin embargo en el procedure siempre puedes mostrar un error, loguearlo, o cualquier otra cosa.

    Si aún persistes en la idea de utilizar un trigger, lo comentas y te lo realizo.

    CREATE TABLE comanda
    (id           INT IDENTITY(1, 1) PRIMARY KEY,
     texto        VARCHAR(10),
     idNoIdentity INT
    );
    GO
    /*He creado la tabla y dejo la columna idNoIdentity como int pero admite nulos*/
    CREATE PROCEDURE sp_InsertarComanda(@texto VARCHAR(10))
    AS
        BEGIN TRAN;
    /*inserto el registro y va un nulo en la columna idNoIdentity*/
            INSERT INTO comanda(texto)
            VALUES(@texto);
    /*Una vez insertado y en la misma transacción, modifico el valor de ese registro por el número que ha dado la columna de identidad */
            UPDATE comanda
              SET
                  idNoIdentity = SCOPE_IDENTITY()
            WHERE id = SCOPE_IDENTITY();
    /*Si no hay errores, confirmo la transacción*/
            IF(@@ERROR = 0)
                COMMIT TRAN;
                ELSE
            ROLLBACK TRAN;
            RETURN;
    GO
    /*Ejemplo del consumo del procedure desde Sql*/
    EXEC sp_InsertarComanda
         'elemento1';
    GO
    SELECT *
    FROM comanda;
    

    Salida

    martes, 23 de octubre de 2018 5:35
  • Te propongo otra solución: Si quieres que la segunda columna siempre sea igual que la primera, añade una columna calculada (en la que el cálculo sea simplemente el valor de la otra columna).

    CREATE TABLE dbo.Comandas
    (  
        idComanda int identity primary key,
        ComandaNo AS idComanda,
        ... otras columnas ...
    ); 

    martes, 23 de octubre de 2018 6:25

Todas las respuestas

  • Hola Arón Sánz:

    Te voy a dejar un ejemplo de como hacerlo con un procedimiento almacenado. No es que no se pueda hacer con un trigger, que es bastante sencillo, es que no tiene lógica hacerlo con un trigger, cuando puedes hacerlo de otro modo, ya que si ocurre un problema, no tienes constancia de ello, sin embargo en el procedure siempre puedes mostrar un error, loguearlo, o cualquier otra cosa.

    Si aún persistes en la idea de utilizar un trigger, lo comentas y te lo realizo.

    CREATE TABLE comanda
    (id           INT IDENTITY(1, 1) PRIMARY KEY,
     texto        VARCHAR(10),
     idNoIdentity INT
    );
    GO
    /*He creado la tabla y dejo la columna idNoIdentity como int pero admite nulos*/
    CREATE PROCEDURE sp_InsertarComanda(@texto VARCHAR(10))
    AS
        BEGIN TRAN;
    /*inserto el registro y va un nulo en la columna idNoIdentity*/
            INSERT INTO comanda(texto)
            VALUES(@texto);
    /*Una vez insertado y en la misma transacción, modifico el valor de ese registro por el número que ha dado la columna de identidad */
            UPDATE comanda
              SET
                  idNoIdentity = SCOPE_IDENTITY()
            WHERE id = SCOPE_IDENTITY();
    /*Si no hay errores, confirmo la transacción*/
            IF(@@ERROR = 0)
                COMMIT TRAN;
                ELSE
            ROLLBACK TRAN;
            RETURN;
    GO
    /*Ejemplo del consumo del procedure desde Sql*/
    EXEC sp_InsertarComanda
         'elemento1';
    GO
    SELECT *
    FROM comanda;
    

    Salida

    martes, 23 de octubre de 2018 5:35
  • Te propongo otra solución: Si quieres que la segunda columna siempre sea igual que la primera, añade una columna calculada (en la que el cálculo sea simplemente el valor de la otra columna).

    CREATE TABLE dbo.Comandas
    (  
        idComanda int identity primary key,
        ComandaNo AS idComanda,
        ... otras columnas ...
    ); 

    martes, 23 de octubre de 2018 6:25