You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中Excel数据导入多表:拆分tempInput至tbl1、tbl2遇tbl2插入问题

解决tempInput数据拆分到tbl1和tbl2的方案

首先我先补全你提到的表结构(因为你给出的tbl1定义不完整),假设tbl1用于存储问题主体信息,tbl2存储每个问题的选项及正确标记:

1. 补全目标表结构

-- 完整的tbl1结构(自增主键question_id)
create table tbl1 (
 question_id int primary key identity(1,1),
 question_text nvarchar(100),
 description nvarchar(100)
)

-- tbl2用于存储选项,关联tbl1的question_id
create table tbl2 (
 option_id int primary key identity(1,1),
 question_id int foreign key references tbl1(question_id),
 option_text nvarchar(20),
 is_right bit -- 1表示正确选项,0表示错误
)

2. 第一步:将问题数据插入tbl1

为了准确关联后续的选项数据,我们先给tempInput加一个临时唯一标识,再通过OUTPUT子句记录插入后的question_id与原tempInput行的映射:

-- 给tempInput添加临时唯一ID,用于后续关联
ALTER TABLE tempInput ADD temp_id INT IDENTITY(1,1);

-- 创建临时表存储映射关系
CREATE TABLE #TempQuestionMapping (temp_id INT, question_id INT);

-- 插入tbl1并记录映射
INSERT INTO tbl1 (question_text, description)
OUTPUT ti.temp_id, inserted.question_id INTO #TempQuestionMapping
SELECT question_text, description
FROM tempInput ti;

3. 第二步:拆分选项数据插入tbl2

这里用UNION ALL把每个选项列拆分成独立行,同时通过临时映射表关联对应的question_id,并标记正确选项:

INSERT INTO tbl2 (question_id, option_text, is_right)
-- 处理option_1
SELECT 
    tqm.question_id,
    ti.option_1 AS option_text,
    CASE WHEN ti.right_option = 'option_1' THEN 1 ELSE 0 END AS is_right
FROM tempInput ti
JOIN #TempQuestionMapping tqm ON ti.temp_id = tqm.temp_id
WHERE ti.option_1 IS NOT NULL -- 过滤空选项
UNION ALL
-- 处理option_2
SELECT 
    tqm.question_id,
    ti.option_2 AS option_text,
    CASE WHEN ti.right_option = 'option_2' THEN 1 ELSE 0 END AS is_right
FROM tempInput ti
JOIN #TempQuestionMapping tqm ON ti.temp_id = tqm.temp_id
WHERE ti.option_2 IS NOT NULL
UNION ALL
-- 处理option_3
SELECT 
    tqm.question_id,
    ti.option_3 AS option_text,
    CASE WHEN ti.right_option = 'option_3' THEN 1 ELSE 0 END AS is_right
FROM tempInput ti
JOIN #TempQuestionMapping tqm ON ti.temp_id = tqm.temp_id
WHERE ti.option_3 IS NOT NULL
UNION ALL
-- 处理option_4
SELECT 
    tqm.question_id,
    ti.option_4 AS option_text,
    CASE WHEN ti.right_option = 'option_4' THEN 1 ELSE 0 END AS is_right
FROM tempInput ti
JOIN #TempQuestionMapping tqm ON ti.temp_id = tqm.temp_id
WHERE ti.option_4 IS NOT NULL;

注意事项

  • 如果你的right_option存储的不是option_1这类字符串(比如是'1'、'A'等),需要调整CASE语句里的判断条件,比如CASE WHEN ti.right_option = '1' THEN 1 ELSE 0 END对应option_1。
  • 如果question_text + description能保证唯一,也可以不用临时映射表,直接通过这两个字段关联tbl1和tempInput,但用临时ID的方式更可靠,避免重复数据导致关联错误。
  • 执行完后可以清理临时对象:DROP TABLE #TempQuestionMapping; ALTER TABLE tempInput DROP COLUMN temp_id;

内容的提问来源于stack exchange,提问作者Babai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:05:56