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 報錯:
子查詢返回的值不止一個。當子查詢跟隨在 =、!=、<、<=、>、>= 之后,或子查詢用作表達式時,這種情況是不允許的



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM