una - Crear desencadenador para insertar un valor de columna en otra columna de la misma tabla SQL Server 2005
restricciones check sql server ejemplos (4)
En su activador, debe actualizar ColumnA solo si ColumnB no es NULL.
Use lo siguiente:
CREATE TRIGGER inserupdate
ON triggertestTable
AFTER INSERT,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
declare @id1 int
select @value=columnB from inserted
if @value is not null
begin
update triggertestTable
set columnA=@value
end
END
GO
Cómo crear un desencadenador para insertar un valor en una columna igual que el valor de otra columna de la misma tabla de una fila recién insertada en la tabla.
Supongamos que tengo una tabla como a continuación
ColumnA | ColumnB
Quiero que el valor de columnB se inserte en ColumnA tan pronto como la fila se inserta en la tabla o el valor de columnB se actualiza. Pero no debería ser al revés, es decir, insertar el valor de la columna A en la columna B
.Los códigos de código manejan solo INSERT, ayúdenme a manejar tanto la inserción como la actualización de la tabla, es decir, cuando se inserta o actualiza el valor de columnB.
CREATE TRIGGER inserupdate
ON triggertestTable
AFTER INSERT,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
declare @value int
select @value=columnB from inserted
update triggertestTable
set columnA=@value
END
GO
Esto funciona bien si los valores se insertan como a continuación
insert into triggertestTable(columnB) values(''xyz'')
El valor ColumnB se inserta en columnA
ColumnA | ColumnB
xyz | xyz
Pero el valor nulo se actualiza en ambos si alguna otra aplicación inserta valor en la columnaA
insert into triggertestTable(columnA) values(''pqr'')
Ahora los registros son
ColumnA | ColumnB
xyz | xyz
NULL | NULL
El conjunto de registros correcto debería ser como a continuación
ColumnA | ColumnB
xyz | xyz
pqr | NULL
Cómo resolver este problema.
Has intentado lo siguiente:
update triggertestTable
set columnA=@value
where columnB is not NULL
Pruebe este disparador (copiará los valores de ColumnB a ColumnA cuando se inserten valores en ColumnB o cuando se actualicen los valores de ColumbB):
CREATE TRIGGER trgIU_triggertestTable_UpdateColumnAWhenColumnB
ON dbo.triggertestTable
AFTER INSERT,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF UPDATE(ColumnB)
BEGIN
UPDATE dbo.triggertestTable
SET ColumnA=i.ColumnB
FROM inserted i
INNER JOIN dbo.triggertestTable t ON i.MyID=t.MyID
LEFT JOIN deleted d ON i.MyID=d.MyID
WHERE d.MyID IS NULL AND i.ColumnB IS NOT NULL -- Row was inserted
OR d.MyID IS NOT NULL -- Row was updated
END
END
GO
Usé esta tabla:
CREATE TABLE dbo.triggertestTable(
MyID INT IDENTITY(1,1) PRIMARY KEY, -- MyID should be a PRIMARY KEY or a mandatory(NOT NULL) UNIQUE constraint
ColumnA VARCHAR(100),
ColumnB VARCHAR(100)
);
GO
inserted
es una pseudo-tabla y puede contener múltiples filas. Deberías escribir algo basado en conjuntos. Algo como:
update triggertestTable
set columnA=COALESCE(columnA,columnB)
where id in (select id from inserted)
(Si triggertestTable
tiene una columna de clave principal llamada id
)
Lo anterior establece el columnA
de columnA
a columnB
, si columnA
ya no tiene un valor, que creo que podría ser lo que está buscando.