Excel批量导入到数据库的方法

这两天在处理Excel批量导入到数据库,用了两种不同的方法:

1、把要导入的数据拼接成字符串,值用特殊字符分割

把上面的单元格复制到Vs ,用Alt键组合添加分割符,组成一行

光标移到尾,删除换行,删除空格和首字符,组成需要的字符串

DECLARE @StrWithPipe NVARCHAR(MAX) = N'C370225A0070|C370225A0070|C370225A0070|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370225A0035|C370225A0035|C370225A0035'

在网络上找了方法,改一下代码,直接使用

sql 复制代码
 -- 创建自定义函数:按|拆分字符串,返回包含每个值的表
CREATE FUNCTION dbo.fn_SplitByPipe (
    @InputStr NVARCHAR(MAX) -- 待拆分的字符串
)

RETURNS @SplitResult TABLE (SplitValue NVARCHAR(MAX)) -- 返回结果表(每行一个值)
AS
BEGIN
    -- 处理空字符串或NULL的情况
    IF @InputStr IS NULL OR LEN(@InputStr) = 0
        RETURN;

    -- 将字符串转换为XML格式(用|分隔符替换为XML节点)
    DECLARE @Xml XML = N'<root><item>' + 
                      REPLACE(@InputStr, N'|', N'</item><item>') + -- 用</item><item>替换|
                      N'</item></root>';

    -- 解析XML,提取所有<item>节点的值(即拆分后的每个元素)
    INSERT INTO @SplitResult (SplitValue)
    SELECT 
        T.c.value('.', 'NVARCHAR(MAX)') AS SplitValue -- 提取节点文本值
    FROM @Xml.nodes('/root/item') T(c) -- 定位到所有item节点
    WHERE T.c.value('.', 'NVARCHAR(MAX)') <> ''; -- 过滤空值(避免首尾|或连续|导致的空元素)

    RETURN;
END;
GO

 declare @id int =124;
 -- 1. 定义字符串变量(若已定义可忽略)
--化料入库DECLARE @StrWithPipe NVARCHAR(MAX) = N'C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035';
--蓝皮领料
--DECLARE @StrWithPipe NVARCHAR(MAX) = N'C370225A0070|C370225A0070|C370225A0070|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370225A0035|C370225A0035|C370225A0035'

--水场化料领料
--DECLARE @StrWithPipe NVARCHAR(MAX) = N'C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370225A0070|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370224A0036|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035|C370225A0035'

--涂饰化料领料
DECLARE @StrWithPipe NVARCHAR(MAX) = N'2025-08-13|2025-08-13|2025-08-13|2025-08-14|2025-08-14|2025-08-14|2025-08-15|2025-08-15|2025-08-15|2025-08-16|2025-08-16|2025-08-16|2025-08-01|2025-08-01|2025-08-01|2025-08-01|2025-08-01|2025-08-01|2025-08-01|2025-08-01|2025-08-01|2025-08-01|2025-08-01|2025-08-01'

-- 2. 声明变量:存储遍历的当前值、游标
DECLARE @CurrentValue NVARCHAR(MAX); -- 存储每次遍历取出的值
DECLARE MyCursor CURSOR FOR -- 声明游标,指向拆分后的结果表
    SELECT SplitValue 
    FROM dbo.fn_SplitByPipe(@StrWithPipe); -- 调用自定义函数拆分字符串

-- 3. 打开游标
OPEN MyCursor;

-- 4. 从游标中取第一条值
FETCH NEXT FROM MyCursor INTO @CurrentValue;

-- 5. 循环遍历:只要能取到值(@@FETCH_STATUS=0表示成功),就继续执行
WHILE @@FETCH_STATUS = 0
BEGIN
    -- 处理当前值(此处示例为打印,实际可替换为业务逻辑:插入表、更新数据等)
	--FPdOrderNo  FBillNo
    PRINT '当前取出的值:' + @CurrentValue;
	update t_ProductMaterialInOut  set FDate=@CurrentValue where id=@id and FormId='涂饰化料领料'
	set @id=@id+1;
	--insert into t_MaterialInOutDetailed (FormId) values ('涂饰化料领料');
	
    -- 取下一条值,继续循环
    FETCH NEXT FROM MyCursor INTO @CurrentValue;
END;

-- 6. 关闭并释放游标(必须执行,否则占用资源)
CLOSE MyCursor;
DEALLOCATE MyCursor;

2、第二种方式,在Excel表格中使用语句,生成所需要的语句

=CONCAT("insert into table values('",C2,"','",D2,"')")

语句上可以修改成和数据库一致的语句,复制所有语句去执行就可以了

相关推荐
l1t11 分钟前
利用DeepSeek改写SQLite版本的二进制位数独求解SQL
数据库·人工智能·sql·sqlite
QT 小鲜肉22 分钟前
【QT/C++】Qt定时器QTimer类的实现方法详解(超详细)
开发语言·数据库·c++·笔记·qt·学习
研究司马懿29 分钟前
【ETCD】ETCD常用命令
网络·数据库·云原生·oracle·自动化·运维开发·etcd
刘一说2 小时前
深入理解 Spring Boot 中的数据库迁移:Flyway 与 Liquibase 实战指南
数据库·spring boot·oracle
August_._2 小时前
【MySQL】SQL语法详细总结
java·数据库·后端·sql·mysql·oracle
升鲜宝供应链及收银系统源代码服务3 小时前
升鲜宝生鲜配送供应链管理系统---PMS--商品品牌多语言存储与 Redis 缓存同步实现
java·开发语言·数据库·redis·缓存·开源·供应链系统
oh,huoyuyan3 小时前
【实战案例】火语言 RPA 采集豆瓣电影剧名、评分等(加载更多),保存到 Excel 全流程(附完整脚本)
excel·rpa
苦学编程的谢4 小时前
Redis_8_List
数据库·redis·缓存
曹天骄4 小时前
阿里云 DCDN → CDN 无缝切换教程(以 example.com 为例)
数据库·阿里云·云计算
AntHub5 小时前
vba 输出到日志文件
excel