sql >> Base de Datos >  >> RDS >> Sqlserver

Hacer referencia a otra columna en la definición DEFAULT en SQL Server 2005

Aquí tienes, estoy demostrando esto con un esquema de ejemplo ya que no has proporcionado los nombres reales de la tabla/columna.

Mesa:

CREATE TABLE test
  (
     id   INT NOT NULL PRIMARY KEY IDENTITY, --made up key
     col1 INT, --first column to add, wasn't sure if this was nullable or not
     col2 INT, --second column to add, wasn't sure if this was nullable or not
     col3 INT NOT NULL --this is the column to optionally insert into
  ) 

Aquí está la definición del disparador:

CREATE TRIGGER demo
ON test
INSTEAD OF INSERT
AS
    INSERT INTO test (col1,col2,col3)
    SELECT inserted.col1,
           inserted.col2,
           CASE
             WHEN inserted.col3 IS NULL THEN COALESCE(inserted.col1, 0) + COALESCE(inserted.col2, 0)
             ELSE inserted.col3
           END
    FROM   inserted

Básicamente, reemplaza cualquier declaración de inserción realizada en la tabla con la del disparador, así que verifico usando inserted tabla temporal para ver si el valor que se intenta insertar en nuestra columna opcional no anulable, col3 , es nulo. Si es así, lo reemplazo con la adición de col1 y col2 (Estoy fusionando con cero porque no mencionaste si las dos columnas de origen son anulables o no).

Luego puede ejecutar declaraciones de inserción que lo incluyen o no, a pesar del hecho de que col3 no es anulable:

INSERT INTO test(col1,col2)
SELECT 12, 31
GO

INSERT INTO test(col1, col2, col3)
SELECT 1, 2, 89
GO

Los resultados son:

ID  COL1 COL2 COL3
------------------  
1   12   31    43
2   1    2     89

Si el activador no estuviera allí, podría haber recibido un error al intentar ejecutar esa primera declaración de inserción, diciéndole que no podía insertar NULL en col3 .

Observe también que la segunda declaración de inserción que especifica un valor no ha sido reemplazada por la adición, como se solicitó.

Aquí hay un SQL Fiddle en funcionamiento .