从两个临时表插入数据至第三个临时表报错的技术咨询
问题分析与解决方案
首先明确说:你的这种处理方式完全不正确,这正是触发报错的核心原因。
错误原因拆解
你当前的代码逻辑存在两个致命问题:
- 第一条
INSERT INTO #3 (...) SELECT Vrsta_Reprograma FROM #1中,INSERT指定了9个目标列,但SELECT仅返回1列,直接违反了「SELECT值数量必须匹配INSERT列数」的规则,这就是你收到报错的直接原因; - 后面的
SELECT (...) FROM #2是完全独立的SQL语句,和前面的INSERT没有任何关联,而且语法本身就有问题(最后一个列名后面多了个多余的逗号)。
简单来说,INSERT INTO ... SELECT ...的核心规则是:SELECT返回的列数、数据类型、顺序必须和INSERT指定的目标列完全对应,你不能拆成两个SELECT来凑列。
正确的处理方式(分两种业务场景)
你需要先明确自己的业务需求,再选择对应的方案:
场景1:#1和#2的数据是关联的(合并列成为一行)
如果#1的每条记录对应#2的一条记录,需要把两者的字段组合成#3的一行,用JOIN关联两个表(记得补充符合你业务逻辑的关联条件):
CREATE TABLE #3 ( Vrsta_Reprograma int, Datum_Kreiranja smalldatetime NOT NULL, Verzija smallint NULL, Zakljucano smallint NULL, HostName nvarchar(128) NULL, Datum_Izvjestaja varchar(10) NULL, Aplikacija varchar(10) NULL, OJK varchar(12) NULL, PartnerID int NULL ) INSERT INTO #3 ( Vrsta_Reprograma, Datum_Kreiranja, Verzija, Zakljucano, HostName, Datum_Izvjestaja, Aplikacija, OJK, PartnerID ) SELECT t1.Vrsta_Reprograma, t2.Datum_Kreiranja, t2.Verzija, t2.Zakljucano, t2.HostName, t2.Datum_Izvjestaja, t2.Aplikacija, t2.OJK, t2.PartnerID FROM #1 t1 -- 替换成你实际的关联条件,比如t1.关联列 = t2.关联列 JOIN #2 t2 ON t1.PartnerID = t2.PartnerID
场景2:#1和#2的数据是独立的行(合并行插入)
如果是要把#1的记录和#2的记录分别插入#3作为独立行,需要用UNION ALL合并两个查询,每个查询都要返回9列(缺少的字段用NULL填充,注意Datum_Kreiranja是NOT NULL约束,不能用NULL,必须给有效值):
CREATE TABLE #3 ( Vrsta_Reprograma int, Datum_Kreiranja smalldatetime NOT NULL, Verzija smallint NULL, Zakljucano smallint NULL, HostName nvarchar(128) NULL, Datum_Izvjestaja varchar(10) NULL, Aplikacija varchar(10) NULL, OJK varchar(12) NULL, PartnerID int NULL ) INSERT INTO #3 ( Vrsta_Reprograma, Datum_Kreiranja, Verzija, Zakljucano, HostName, Datum_Izvjestaja, Aplikacija, OJK, PartnerID ) -- 插入#1的数据,NOT NULL的Datum_Kreiranja给个有效值,比如当前时间 SELECT Vrsta_Reprograma, GETDATE(), NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM #1 UNION ALL -- 插入#2的数据,Vrsta_Reprograma用NULL填充 SELECT NULL, Datum_Kreiranja, Verzija, Zakljucano, HostName, Datum_Izvjestaja, Aplikacija, OJK, PartnerID FROM #2
额外注意事项
- 针对
Datum_Kreiranja的NOT NULL约束:如果场景2中#1没有对应的日期值,你可以在建表时给该列加DEFAULT GETDATE()默认值,或者插入时明确提供合法的日期值,避免触发约束报错; - 确保两个临时表的字段数据类型和#3的目标列匹配,避免隐式转换带来的意外问题。
内容的提问来源于stack exchange,提问作者unknown
相关产品推荐
相关产品推荐

