insert into select 引起的 "子查询返回的值不止一个。当子查询跟随在**之后,或子查询用作表达式时,这种情况是不允许的"
目录
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
报错:子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的