Sql server 如何在T-SQL中设置和检查插入表中变量的值?

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

我已经创建了一个触发器,通过检查另一个表中的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 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;