Ben*_* Z. 4 trigger sql-server
在我的数据库中,我有两个表:projects和comp_types. 创建新项目时,会触发一个触发器,该触发器会在projects表中的列中插入一个串联值。
一个完全工作的SQL Fiddle。
请运行它,你会看到,它有效。
但是,当我尝试在 SQL Server 中运行它时,我收到以下错误:
子查询返回了 1 个以上的值。当子查询跟随 =、!=、<、<=、>、>= 或当子查询用作表达式时,这是不允许的。
截图:http : //i.stack.imgur.com/38rKV.jpg
SQL Server 中的所有表都是新鲜的,没有数据(就像小提琴一样)。
我究竟做错了什么?
您的触发器没有WHERE子句,与刚刚插入的行不相关,并且不处理在单个操作中可能插入多行的情况(与某些平台不同,在 SQL Server 中,每个语句触发触发器,而不是每行)。所以它只会工作一次:当你将第一行插入projects表格时。请尝试以下操作:
CREATE TRIGGER dbo.create_proid -- please always use schema prefix
ON dbo.projects
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE p
SET pro_id = CONVERT(VARCHAR(20), c.comp_type)
+ '-'
+ RIGHT('00000' + CONVERT(NVARCHAR(20), i.client_id),
CASE WHEN i.client_id < 100000 THEN 5 ELSE 6 END)
+ '-'
+ RIGHT('00000' + CONVERT(NVARCHAR(20), i.id),
CASE WHEN i.id < 100000 THEN 5 ELSE 6 END)
FROM dbo.projects AS p
INNER JOIN inserted AS i
ON p.id = i.id
INNER JOIN dbo.comp_types AS c
ON p.comp_type_id = c.comp_type_id;
END
Run Code Online (Sandbox Code Playgroud)
pro_id当您可以在运行时确定该值时,不确定为什么要存储该值。您是否还有一个更新触发器可以在comp_type_id更改时维护它?如果 acomp_type被删除怎么办?
另外请始终使用架构前缀,并且不要在NVARCHAR没有指定长度的情况下转换为。为什么要使用text数据类型?这已被弃用多年 - 您应该使用NVARCHAR(MAX)或VARCHAR(MAX) 仅当这些名称和描述确实超过 4000/8000 个字符(从命名中不太可能)。