上一篇
场景引入:
想象你正面对一个需要批量插入上万条订单明细的存储过程,传统的拼接SQL或循环插入让代码臃肿如春运火车厢😫,这时,一个叫表参数(Table-Valued Parameter, TVP) 的SQL Server功能悄悄举手:"让我来!"
表参数是SQL Server 2008引入的"数据集装箱"🚢,它允许你将整个数据表作为参数传递给存储过程或函数,本质上,它是用户定义的表类型(User-Defined Table Type)的实例。
-- 先定义表类型 CREATE TYPE OrderDetailType AS TABLE ( ProductID INT, Quantity INT, UnitPrice DECIMAL(18,2) ); GO -- 在存储过程中使用 CREATE PROCEDURE usp_InsertOrders @OrderHeaderID INT, @Items OrderDetailType READONLY -- 关键在这里! AS BEGIN INSERT INTO OrderDetails(OrderID, ProductID, Quantity, Price) SELECT @OrderHeaderID, ProductID, Quantity, UnitPrice FROM @Items; END
方法 | 代码可读性 | 网络往返 | 性能 |
---|---|---|---|
拼接动态SQL | ❌ 差 | 多次 | ⚠️ 风险高 |
单条循环插入 | ❌ 差 | 极多 | 🐢 龟速 |
表参数 | ✅ 清晰 | 1次 | 🚀 优秀 |
-- 技巧1:明确指定表类型的排序规则 CREATE TYPE SampleType AS TABLE ( Name NVARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS ); -- 技巧2:对常查询的列添加主键 CREATE TYPE IndexedType AS TABLE ( ID INT PRIMARY KEY, -- 这里! Data VARCHAR(100) ); -- 技巧3:限制数据量(超大数据考虑分批次) DECLARE @Batch1 OrderDetailType; INSERT @Batch1 SELECT * FROM @BigData WHERE ID <= 5000; EXEC usp_Process @Batch1;
当客户端传JSON数据时,可以这样优雅转换:
DECLARE @TVP OrderDetailType; INSERT @TVP SELECT * FROM OPENJSON(@JsonInput) WITH ( ProductID INT '$.pid', Quantity INT '$.qty', UnitPrice DECIMAL '$.price' );
READONLY
的,如需修改需先复制到临时表 ✅ 批量DML操作(插入/更新/删除)
✅ 多条件动态查询(替代长参数列表)
✅ 服务层到数据库的高效数据传递
❌ 单行数据传递(杀鸡用牛刀)
❌ 需要表内修改再回传的情况
:
表参数就像SQL Server里的"快递小哥"🛵,一次性打包运输大量数据,既省时又省力,下次遇到批量操作时,不妨试试这个被低估的功能,你会回来点赞的! 👍
(注:本文测试基于SQL Server 2022环境,2025-08验证有效)
本文由 夏侯柏 于2025-08-05发表在【云服务器提供商】,文中图片由(夏侯柏)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://up.7tqx.com/wenda/539864.html
发表评论