把一张用户表从库里搬出来、变成一串能直接执行的 INSERT 语句这件事听起来像只有运维才会碰的活但实际场景远比想象中杂给测试环境造一份脱敏样本、把线上问题数据打包给同事复现、把某几张表塞进版本库做基线、把一个老旧系统里的历史客户迁移到新系统。这些需求最后往往都收敛到同一个动作——生成一份纯文本的 INSERT 脚本谁拿到都能跑不依赖任何客户端工具。我前后做过十几次类似的导出从最早用图形界面向导一点点勾选项到后来自己写 T-SQL 拼语句中间踩过的坑基本都集中在两件事上特殊字符和类型精度。这篇就把 SQLServer 用户表数据导出为 Insert 语句的完整实现方案摊开讲从方案选型、类型映射、脚本编写、分批落地到导回验证全流程走一遍。文中给的脚本可以直接复制改两个参数就跑也能当成模板改成导出任意表。适合手上有数据迁移、测试数据准备、问题复盘需求又不想被图形化工具的不确定性坑到的朋友。1. 先把需求拆开导出 INSERT 语句到底卡在哪1.1 我遇到的四类典型场景第一类是小批量数据传递比如某个用户反馈了一条数据异常需要把相关的几十行记录给到开发去本地复现。这种场景数据量小但对能不能一次跑通要求极高脚本里只要有一个单引号没转义整个文件就报废了。第二类是测试环境造数从生产抽几百上千行真实结构的数据脱敏后灌进测试库这时候要考虑的是自增列、外键、触发器这些环境差异。第三类是系统迁移的过渡方案新系统还没做好数据同步通道先用 INSERT 脚本把历史数据搬过去顶一阵子数据量可能到百万级必须分批。第四类是版本基线把字典表、配置表这种小表的数据跟着建表脚本一起进代码库保证任何人拉下代码都能跑起一个可用的初始环境。这四类场景对脚本的要求完全不一样。第一类追求稳字符转义必须彻底第二类追求干净自增列和约束要处理好第三类追求吞吐得分批、得能断点续传第四类追求可读最好一个表一个文件、方便 diff。所以别急着打开工具先想清楚自己属于哪一类后面的选型和参数设置才有依据。注意这四类场景里只有第一类和第四类适合用图形化向导。第二类和第三类用向导大概率会在中途超时或者把长文本截断而且出错之后你根本不知道是哪一行的哪一列坏的。1.2 五条可选路线横向对比我把能想到的路线都列出来并且按自己的实际使用体验打了分。评分维度是可控性和省事程度两个方向因为在真实项目里这两个往往是矛盾的。路线适用数据量可控性上手成本主要风险SSMS 生成脚本向导万行以内中低长文本截断、超时、编码导入导出向导不适用低低根本不产出 INSERT 文本自写 T-SQL 拼接无上限可分批高中类型覆盖不全导致精度丢失客户端的数据比较工具差异级千行内中低只适合两个库对比不适合裸表命令行工具 查询导出百万级高中高参数不熟容易出乱码这里要特别说明一下导入导出向导这一行。很多人第一反应是它但它产出的是 bcp 格式文件或者直接写目标库压根不生成 INSERT 语句。我在早期项目里被这个误导过一次花了一个下午才确认此路不通所以这里直接标不适用省得后来人再走一遍。至于客户端的数据比较工具它其实是两库对比 生成同步脚本如果你的源和目标都存在它非常好用能自动算差异、自动排序、自动处理依赖。但如果你的目标是把这张表的数据导成一份独立的 SQL 文件它就不合适了因为它总是要连两个库。真正通用的是自写 T-SQL 拼接。它的核心思路简单到一句话就能说完用元数据把表的列清单读出来为每一列生成一段把这个值转成合法的 SQL 字面量的表达式然后把所有列表达式拼成一条 INSERT 模板最后SELECT一遍源表每行产出一句。听起来简单但要做得能上生产细节全在类型映射上。2. 类型映射拼字符串之前必须钉死的细节2.1 单引号、N 前缀与 Unicode 那些事所有字符串类列在拼接时都必须做两件事加引号、转义引号。加引号是为了让生成出来的文本是合法的字符串字面量转义是为了防止数据里本身带单引号把语句截断。经典的写法是REPLACE(值, , )也就是把一个单引号替换成两个。这一步漏掉的后果非常直观只要用户表里有一个人的昵称叫ONeil生成的脚本执行到那一行就会报语法错误而且报错位置跟真实问题点往往差好几行排查起来很烦。N前缀是另一个高频踩坑点。SQL Server 里中文和N中文是两种不同的字面量前者是 varchar会按当前数据库的排序规则和代码页去转换一旦源列是 nvarchar 而目标库的排序规则不匹配中文就会变成问号。所以只要源列属于 nchar、nvarchar、ntext、sysname 这几个类型生成的字面量前面就必须带N。我的做法是在列表达式的 CASE 分支里根据类型名动态决定要不要拼这个N而不是图省事全加或者全不加。全加的问题在于某些只接受 varchar 的目标列会多一次隐式转换虽然大多不报错但在严格模式下会出警告全不加则直接丢中文属于不可接受的错误。还有一个容易被忽略的点char(n)是定长类型值末尾的空格在存储时是补齐的但很多工具导出时会去掉尾部空格导回去之后LEN结果就变了。如果你的业务里有字段依赖定长补位比如某些老系统的编码字段导出时必须保留原值别做任何 TRIM 处理。我一般会在校验环节专门对这类列做一次DATALENGTH比对能快速发现是不是被裁剪过。2.2 数值和日期精度是怎么悄悄丢掉的数值类型的坑主要出现在 decimal 和 float 上。decimal 的写法是CAST(值 AS VARCHAR(60))直接转字符串就能完整保留精度因为 decimal 转字符是精确转换。但如果你在中途经过了 float 中转比如为了统一处理把所有数值列都先转成 float 再转字符那 38 位精度的金额就会变成一串1.2345000000000001E07之类的东西导回去之后金额全错。我见过一次财务对账差异最后追下去就是导出脚本里金额列走了 float 中转差了几分钱查了两天。float 和 real 的处理要单独拿出来说。这两个类型本身就是近似值默认转字符串只会给 6 位有效数字远远不够还原。正确的做法是用CONVERT(VARCHAR(60), CAST(列 AS FLOAT), 3)style 3 会输出 17 位有效数字这是 double 精度下能往返转换的最短表示。虽然理论上还是可能有一丁点误差但实际业务里足够用了。日期时间类型的关键是必须带引号而且要选一个不受语言设置影响的格式。CONVERT(NVARCHAR(40), 列, 121)输出的是yyyy-mm-dd hh:mi:ss.mmm这种 ISO 风格无论服务器语言是英语还是简体中文都能正确解析这是我默认的选择。如果有人图省事直接CAST(日期 AS VARCHAR)在某些语言环境下会输出01/02/2025这种歧义格式目标库解析成 1 月 2 日还是 2 月 1 日完全看运气。datetime2的精度可以到 7 位小数CONVERT的 121 样式会保留实际精度这点没问题。datetimeoffset稍微麻烦它带时区偏移用 121 样式转出来会丢掉偏移量导回去就变成了本地时间。这一列的导出我建议生成之后专门抽样核对两三条把生成的字面量和源表里的显示值对比一下确认偏移量还在。如果确认丢了就改成先CAST成NVARCHAR(50)让它走默认转换默认转换通常能带上偏移。2.3 二进制、GUID 和那些导不了的列binary和varbinary类型的正确输出形式是十六进制字面量0x1A2B3C用CONVERT(VARCHAR(MAX), 列, 2)就能拿到不带0x前缀的十六进制串前面手动补上0x即可。这类列不需要加引号因为0x...本身就是合法的二进制字面量。要注意的是image类型已废弃但老库里还有在转换时可能受 8000 字节限制得用VARCHAR(MAX)接。如果表里有存照片或者文件的列导出来的脚本会非常巨大一行可能就是几兆这种情况下我一般建议把二进制列单独拆出去或者干脆不导在目标端通过文件路径重新关联。uniqueidentifier直接转成 36 位字符串加引号即可不需要额外处理。xml类型可以CAST成nvarchar(max)之后按字符串处理转义逻辑完全一样。有几类列是不应该出现在 INSERT 里的必须显式排除timestamp和rowversion是行版本戳由数据库自动维护写进去会报错计算列的值也是自动算出来的写进去同样报错。这两个条件在元数据查询里各加一个判断就行漏掉的话生成的脚本一执行就报不能更新计算列。还有一类是类型不在我 CASE 覆盖范围内的比如geography、geometry、hierarchyid、sql_variant。这些类型直接转字符串会得到不可用的结果。我的处理原则是默认走最保守的转 nvarchar 加引号分支保证语法上不报错但如果这个表真的有这类列就单独给它写一个分支比如hierarchyid用列.ToString()geography用列.STAsText()。别指望一个通用脚本能覆盖所有类型通用脚本的目标是覆盖 95% 的日常表剩下 5% 手动补。3. 一套自用的 T-SQL 生成器从零写到能跑3.1 元数据采集用 sys.columns 拼出列清单和列表达式整个脚本的骨架只有三块参数区、元数据区、执行区。参数区把 schema、表名、过滤条件、分批大小这些东西集中到顶部改起来一目了然。元数据区去sys.columns和sys.types里把列名、类型名、是否计算列都捞出来用QUOTENAME给列名加上方括号防止列名里带空格或者关键字。然后用一个STRING_AGG把每列的表达式片段按 column_id 顺序拼成一个长长的字符串。这里有个工程上的小技巧因为生成的表达式里要包含大量单引号手写拼接极其容易数错所以我用REPLICATE(CHAR(39), 4)和REPLICATE(CHAR(39), 6)预先把一个单引号的字面量和两个单引号的字面量定义成变量Q4和Q6后面全部用变量拼接。这样代码里不用再数一串引号可读性和正确性都大幅提升。这个技巧是我在第 N 次数错引号之后被迫想出来的强烈建议照抄。STRING_AGG是 SQL Server 2017 才有的函数如果目标实例版本更老改成FOR XML PATH()加STUFF的经典写法逻辑完全一样只是啰嗦一点。另外STRING_AGG的排序要用WITHIN GROUP (ORDER BY column_id)显式指定否则拼接顺序不保证虽然对 INSERT 的正确性没影响但对生成脚本的可读性和 diff 稳定性影响很大。3.2 完整脚本可直接改参数使用下面这份是精简过的完整版参数区改两行就能跑。我把它拆成了注释清晰的几段方便你按需删改。/* 1. 参数区 */ DECLARE Schema SYSNAME Ndbo; DECLARE Table SYSNAME NUsers; DECLARE Where NVARCHAR(MAX) N; -- 例: NWHERE Status 1 DECLARE KeyCol SYSNAME NId; -- 分批排序用的稳定列 DECLARE BatchSize INT 5000; DECLARE Sep NVARCHAR(20) N, NCHAR(10) N ; /* 2. 引号字面量工具 */ DECLARE Q4 VARCHAR(4) REPLICATE(CHAR(39), 4); -- 一个单引号的字面量 DECLARE Q6 VARCHAR(6) REPLICATE(CHAR(39), 6); -- 两个单引号的字面量 DECLARE FullName NVARCHAR(300) QUOTENAME(Schema) N. QUOTENAME(Table); DECLARE ColList NVARCHAR(MAX); DECLARE ColExpr NVARCHAR(MAX); DECLARE IdCol SYSNAME; SELECT IdCol name FROM sys.identity_columns WHERE object_id OBJECT_ID(FullName); /* 3. 元数据 表达式生成 */ ;WITH c AS ( SELECT col.column_id, qn QUOTENAME(col.name), ty t.name FROM sys.columns col JOIN sys.types t ON t.user_type_id col.user_type_id WHERE col.object_id OBJECT_ID(FullName) AND col.is_computed 0 AND t.name NOT IN (timestamp, rowversion) ) SELECT ColList STRING_AGG(CAST(qn AS NVARCHAR(MAX)), N, ) WITHIN GROUP (ORDER BY column_id), ColExpr STRING_AGG(CAST( CASE WHEN ty IN (char,varchar,text,nchar,nvarchar,ntext,sysname) THEN CASE WHEN qn IS NULL THEN NULL ELSE CASE WHEN ty IN (nchar,nvarchar,ntext,sysname) THEN N ELSE END Q4 REPLACE(CAST( qn AS NVARCHAR(MAX)), Q4 , Q6 ) Q4 END WHEN ty IN (int,bigint,smallint,tinyint) THEN CASE WHEN qn IS NULL THEN NULL ELSE CAST( qn AS VARCHAR(20)) END WHEN ty IN (numeric,decimal,money,smallmoney) THEN CASE WHEN qn IS NULL THEN NULL ELSE CAST( qn AS VARCHAR(60)) END WHEN ty IN (float,real) THEN CASE WHEN qn IS NULL THEN NULL ELSE CONVERT(VARCHAR(60), CAST( qn AS FLOAT), 3) END WHEN ty bit THEN CASE WHEN qn IS NULL THEN NULL WHEN qn 1 THEN 1 ELSE 0 END WHEN ty IN (datetime,datetime2,smalldatetime,date,time) THEN CASE WHEN qn IS NULL THEN NULL ELSE Q4 CONVERT(NVARCHAR(40), qn , 121) Q4 END WHEN ty datetimeoffset THEN CASE WHEN qn IS NULL THEN NULL ELSE Q4 CONVERT(NVARCHAR(50), qn , 121) Q4 END WHEN ty uniqueidentifier THEN CASE WHEN qn IS NULL THEN NULL ELSE Q4 CONVERT(NVARCHAR(36), qn ) Q4 END WHEN ty IN (binary,varbinary,image) THEN CASE WHEN qn IS NULL THEN NULL ELSE 0x CONVERT(VARCHAR(MAX), qn , 2) END ELSE CASE WHEN qn IS NULL THEN NULL ELSE Q4 REPLACE(CAST( qn AS NVARCHAR(MAX)), Q4 , Q6 ) Q4 END END AS NVARCHAR(MAX)), Sep) WITHIN GROUP (ORDER BY column_id) FROM c; /* 4. 组装 INSERT 模板 */ DECLARE Head NVARCHAR(MAX) NINSERT INTO FullName N ( ColList N) VALUES ( ColExpr N N);; /* 5. 分批执行结果落临时表 */ IF OBJECT_ID(tempdb..#Out) IS NOT NULL DROP TABLE #Out; CREATE TABLE #Out (id INT IDENTITY(1,1) PRIMARY KEY, stmt NVARCHAR(MAX)); DECLARE Sql NVARCHAR(MAX), Skip INT 0, Affected INT 1; WHILE Affected 0 BEGIN SET Sql NSELECT Head N AS stmt FROM FullName CASE WHEN Where N THEN N ELSE N Where END N ORDER BY QUOTENAME(KeyCol) N OFFSET skip ROWS FETCH NEXT bs ROWS ONLY; INSERT INTO #Out (stmt) EXEC sp_executesql Sql, Nskip INT, bs INT, skip Skip, bs BatchSize; SET Affected ROWCOUNT; SET Skip BatchSize; END /* 6. 输出自增列需要包一层开关 */ IF IdCol IS NOT NULL SELECT NSET IDENTITY_INSERT FullName N ON; AS stmt, 0 AS ord UNION ALL SELECT stmt, id FROM #Out UNION ALL SELECT NSET IDENTITY_INSERT FullName N OFF;, 2147483647 ORDER BY ord; ELSE SELECT stmt FROM #Out ORDER BY id;脚本里有几处值得单独说明。第 5 段的循环用OFFSET ... FETCH做分页好处是不依赖具体的主键类型坏处是深分页时性能会随 offset 增大而下降因为每一批都要跳过前面所有行。如果你的表超过几百万行建议改成键值游标的方式也就是每批WHERE KeyCol LastKey ORDER BY KeyCol然后从上一批里取最大键值作为下一批的起点。键值游标的问题是要求排序列唯一且单调自增主键天然满足GUID 主键就不行了。第 6 段的UNION ALL加ORDER BY ord是个小技巧用来把IDENTITY_INSERT的开启和关闭语句夹在正确的位置。用2147483647作为最后的排序值保证关闭语句永远在末尾。这种做法在生成脚本很短的时候看起来有点小题大做但当你导的是几十万行、需要把文件拆开执行的时候这个顺序保证非常重要。另外注意Where那个参数它是直接拼进 SQL 的所以只能放你自己写的常量条件绝不能把外部输入传进来。这一点在内部工具化的时候要写死在注释里避免有人拿去做成通用服务之后留下注入口子。3.3 把结果落地成 .sql 文件生成到#Out之后最直接的方式是在 SSMS 里点结果另存为选文本文件扩展名写成.sql。但这里有两个必须提前调的设置否则文件一定是坏的。第一个是将结果保存为里的编码要选带 BOM 的 UTF-8 或者 Unicode纯 ASCII 编码存中文会直接变问号。第二个是每列显示的最大字符数默认是 256超过这个长度的值会被截断成省略号nvarchar(max)的列必挂。这个设置在 选项 → 查询结果 → SQL Server → 以网格显示结果/以文本显示结果 里。数据量大的时候我更推荐走命令行一次性把整个脚本文件写出来不经过 SSMS 的界面层省心很多。做法是把上面的脚本保存成gen.sql然后用命令行工具执行并重定向输出sqlcmd -S 127.0.0.1 -d DemoDB -E -f 65001 -y 0 -h -1 -W -i gen.sql -o out.sql参数的意思分别是-f 65001指定 UTF-8 代码页-y 0把变长类型的显示宽度设成不限制这是防止长文本被截断的关键-h -1去掉列头-W去掉每行尾部的填充空格-i和-o分别是输入和输出文件。这几项里最容易漏的是-y 0不写的话默认宽度只有几十个字符生成的 INSERT 语句会被齐刷刷截断。生成的out.sql里每行是一条完整的 INSERT。文件头建议手动加三行SET NOCOUNT ON;、GO、以及一段注释写明源库、源表、导出时间、行数。别小看这段注释半年后你或者别人再拿到这个文件第一眼需要确认的就是这是什么时候从哪儿导的。4. 图形化路线向导怎么用才不出事4.1 生成脚本向导里那几个必调的选项如果数据量在万行以内用图形化确实更省事。路径是右键数据库 → 任务 → 生成脚本然后一路下一步关键是最后那个高级按钮点开之后的几个选项。第一个是要编写脚本的数据的类型必须选架构和数据或者仅数据选仅架构就只
企业数字化 ERP 产品动态
相关推荐
大数据并行计算:原理、框架与性能优化实战 1. 并行计算在大数据处理中的核心价值当数据规模从GB级跃升到TB甚至PB级时,单机处理就像用勺子舀干游泳池的水。我在2013年第一次处理10TB用户行为日志时,单机跑批处理足足花了38小时,而通过并行化改造后缩短到47分钟——这正是并行计算在大数… · 2026/11/4 7:50:21
真无线耳机主副耳协同设计:FWS架构与BES2300-H芯片解析 简介:BES2300-H 数据手册 v0.22 面向蓝牙音频产品开发工程师与硬件设计人员,聚焦 Bestechnic(上海)蓝牙音频平台在 FWS 全无线立体声与 Google Bisto 支持下的规格细节,可用于方案选型、硬件集成与参数核对。资源包共 … · 2026/11/5 3:17:48
RegCool绿色版:高效安全的Windows注册表管理工具 1. 项目概述:RegCool 绿色版的核心价值作为Windows系统管理员和高级用户,注册表编辑器是我们日常工作中不可或缺的工具。系统自带的regedit虽然基础,但在处理复杂任务时往往力不从心。这正是RegCool v3.0.0.5绿色版的价值所在——它就像给注册… · 2026/11/5 10:09:42
EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析 1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被… · 2026/11/5 16:49:35
Rust原来很简单二:所有权系统 Part 2 核心篇 —— 所有权系统
本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理
6… · 2026/11/5 16:26:08
基于Hadoop+Spark的民宿智能推荐系统设计与实现 1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享… · 2026/11/5 14:59:25
ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配RS485,解决远距离温度监控难题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07