Sql server 如何在T-SQL中设置和检查插入表中变量的值?
我已经创建了一个触发器,通过检查另一个表中的status字段将数据插入到一个表中Sql server 如何在T-SQL中设置和检查插入表中变量的值?,sql-server,tsql,Sql Server,Tsql,我已经创建了一个触发器,通过检查另一个表中的status字段将数据插入到一个表中 CREATE trigger [dbo].[insercionVentasConcluidadas] on [dbo].[pedido] after update as declare @fechaactual date declare @estado varchar begin if UPDATE(estado) begin select @estado = estado
CREATE trigger [dbo].[insercionVentasConcluidadas]
on [dbo].[pedido]
after update
as
declare @fechaactual date
declare @estado varchar
begin
if UPDATE(estado)
begin
select @estado = estado from inserted;
set @fechaactual = GETDATE();
if (@estado = 'cerrado')
print N'RAS'
begin
insert into ventaConcluida(numeroPedido, nombreCliente, nombreProveedor, fechaCreacion, fechaCierre, diasTranscurridos, MontoPedido)
select d.idPedido, d.nombreCliente, d.nombreProveedor, d.fechaPedido, @fechaactual, dbo.calculoDias(d.fechaPedido, @fechaactual),
d.montoPedido
from inserted i
inner join deleted d
on i.idPedido = d.idPedido
end
end
end
触发器应该做的是,当变量@estado
等于cerrado
时,在另一个名为pedido
的表更新后,当该表中的status=cerrado
时,在该表上插入数据,并使用插入的选择@estado=estado设置值
其中允许的值仅为cerrado、creado和parcial
,但实际上它插入了这些状态中的任何一种,因此我认为问题可能是设置变量或检查值if(@estado='cerrado')
。
另一个问题是,它只在添加行时插入数据,执行触发器时插入数据,但不打印行。这对于注释来说太长了,但非常重要,您需要清楚地理解它。您有(为了清晰起见,请精简):
if(@estado='cerrado')
打印N'RAS'
开始
终止
这与:
if (@estado = 'cerrado')
print N'RAS';
begin
<do stuff>
end;
if(@estado='cerrado')
打印N'RAS';
开始
终止
开始/结束块与IF语句没有关系。代码基于IF语句所做的唯一事情就是它后面的打印。请注意,生产触发器不应尝试返回结果集或打印。对于开发和调试来说可能还可以,但在生产代码中则不行 你的扳机有严重缺陷。它假定插入的行中只有一行。在SQL Server中,每个操作触发一次激发。因此,它们需要以设置为基础。您也有没有指定大小的varchar…这是一个糟糕的做法。你的
如果。。。打印
逻辑将开始
/结束
块与插入
放在if
之外。这是故意的吗?@SeanLange就是这样!变量的声明。我并不认为这是一件重要的事情,因为在默认情况下,如果不指定大小,它将设置一个最大大小。谢谢这只是你的触发器问题的一部分。你也需要修复它的其余部分。
if (@estado = 'cerrado')
print N'RAS';
begin
<do stuff>
end;