【问题标题】:Case statement inside trigger触发器内的case语句
【发布时间】:2013-02-06 09:46:53
【问题描述】:
create trigger Insert_emp on dbo.emp
after insert
as
begin

declare @tablename varchar(50)
declare @rdatetime varchar(20)
declare @month int

set @rdatetime = (select Bdate from inserted)
set @month = (select datepart(mm,@rdatetime))
case when @month = 2 then set @tablename = 'FEP_EMP' end
print @tablename 
end

触发器将在 emp 表中插入记录之后执行。它将选择插入的日期。从该日期开始计算月份。我要设置表名的值。

【问题讨论】:

  • 对不起,我忘了提。我使用的是 sql server 2005。
  • SQL Server 中的 CASE 只能返回 标量值 - 不能返回表达式或代码块
  • 请注意inserted 是一个伪表,可以包含多个行。因此,像你一样为标量变量赋值是非常危险的——它会从 one 行(未定义的行)中赋值。如果您以这种方式分配多个变量,则每个变量都可能从 不同 行中获得分配值。您应该编写触发器以始终将inserted 视为具有多行的表。

标签: asp.net sql sql-server-2005


【解决方案1】:

SQL Server 中的 CASE 只能用于获取标量值 - 它不能用于决定执行哪个代码块或语句。要处理条件代码执行,请使用常规的 IF / ELSE 语句。

将您的触发器更改为:

create trigger Insert_emp on dbo.emp
after insert
as
begin

   declare @tablename varchar(50)
   declare @rdatetime varchar(20)
   declare @month int

   set @rdatetime = (select Bdate from inserted)
   set @month = (select datepart(mm,@rdatetime))

   IF @month = 2 
      set @tablename = 'FEP_EMP' 

   print @tablename 
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多