首页 > 其他 > 详细

insert into select 引起的 "子查询返回的值不止一个。当子查询跟随在**之后,或子查询用作表达式时,这种情况是不允许的"

时间:2019-10-25 21:28:54      阅读:362      评论:0      收藏:0      [点我收藏+]

1、事故现场

1.1 在使用 Insert into Table2 select * from Table1 将表1的数据插入到表2时,报错如下:

子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的

技术分享图片

1.2 sql 语句

Insert into PS_User(ID,LogonName,RealName) 
select ID,LogonName,RealName from Table_4

2、推测

当Table_4表中只有一条数据的时候,没有问题,可以成功插入;
新建另外一张表Table_5,字段类型同Table_4一样,则可以成功;

Insert into Table_5(ID,LogonName,RealName) 
select ID,LogonName,RealName from Table_4

由此说明,表PS_User有有些额外的限制,导致无法将多条数据同时插入,
经仔细排查,发现PS_User有个触发器 [PS_User_Insert]

CREATE TRIGGER [dbo].[PS_User_Insert]  ON  [dbo].[PS_User]
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    DECLARE @UserId INT;
    SET @UserId=(SELECT [ID] FROM INSERTED);
    BEGIN TRAN
    insert into PS_Action (ActionType, UserID, UserIP, Description) values(42, @UserId, '', '初始化用户积分')
    if @@ERROR=0
        COMMIT
    else
        ROLLBACK 
END
GO

其中有一行代码:

SET @UserId=(SELECT [ID] FROM INSERTED);

因为 INSERTED 中有多条数据,故向@userid写入的时候,报错:
子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的

3、解决方案

CREATE TRIGGER [dbo].[PS_User_Insert2]  ON  [dbo].[PS_User]
   AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    BEGIN TRAN
    insert into PS_Action (ActionType, UserID, UserIP, Description)
    select 42, ID, '', '初始化用户积分' from INSERTED
    
    if @@ERROR=0
        COMMIT
    else
        ROLLBACK 
END
GO

4、总结

因触发器中写法,导致 insert into报错:
子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的


insert into select 引起的 "子查询返回的值不止一个。当子查询跟随在**之后,或子查询用作表达式时,这种情况是不允许的"

原文:https://www.cnblogs.com/willingtolove/p/11740882.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!