SQL-代替INSERT和临时变量

时间:2019-03-20 15:40:37

标签: sql sql-server triggers ssms

我为此触发将新的PersonID插入客户表:

CREATE TRIGGER [dbo].[tr_insert_PersonID]  ON  [dbo].[CustomersTB]

instead of INSERT 
as

BEGIN
    declare @PersonID int;
    select @PersonID = (select PersonID from inserted)

    if  (@PersonID<=999999999) and
        (not EXISTS (Select PersonID From [dbo].[CustomersTB] where @PersonID = [dbo].[CustomersTB].PersonID))
    begin
        .
        .   
    end 
END

当手动插入一个PersonID时它起作用,但是当尝试从其他表插入时,出现此错误:

  

子查询返回了多个值。当   子查询遵循=,!=,<,<=,>,> =,或当子查询用作   表达式。

指向该行:

  

select @PersonID =(从插入的列表中选择PersonID)

不知道要更改什么以及如何更改它

1 个答案:

答案 0 :(得分:3)

到目前为止,评论中所写的所有内容(当前的最后一条评论是Damien关于ISNUMERIC的回答您不想问的问题), 似乎您正在使用instead of触发器进行验证-在这种情况下,您选择了错误的工具来完成这项工作。

除非常特殊的情况外,应使用约束条件进行验证。

在这种情况下,您首先应确保为PersonId使用了正确的数据类型。

如果要使用数字,请使用数字数据类型。如果您希望它是一个整数,请使用int(如果是非常大的整数,请使用bigint)。

如果您希望它是唯一的,请向其添加一个unique indexunique constraint,或考虑它是否应该是表的primary key(根据定义是唯一的)。

如果您希望它是一个至少9位数字的数字,请添加一个check constraint,该数字将拒绝100,000,000下的任何值。