如何通过存储过程将符合条件的数据从tbl_base插入到tbl_Rank?
实现从tbl_base向tbl_Rank插入符合条件数据的存储过程
没问题,我来帮你搞定这个存储过程,先提个小细节:你提供的tbl_Rank创建脚本里有个笔误——ALTER TABLE操作的对象是tbl_League,但你的目标表是tbl_Rank,记得把这两处改成tbl_Rank,不然默认约束会加到错误的表上,影响后续插入时的默认值生效。
存储过程代码
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE dbo.sp_InsertIntoRankFromBase AS BEGIN -- 关闭计数消息,让输出更简洁,也能小幅提升性能 SET NOCOUNT ON; -- 直接筛选并插入符合条件的数据 INSERT INTO dbo.tbl_Rank (Name, Lv) SELECT NameCharacter, Level FROM dbo.tbl_base WHERE Level > 39; -- 可选:如果需要知道插入了多少条记录,取消下面的注释 -- PRINT '成功插入 ' + CAST(@@ROWCOUNT AS VARCHAR) + ' 条记录到tbl_Rank' END GO
代码说明
- 用
INSERT...SELECT的方式一次性完成筛选和插入,比先查询再循环插入高效得多。 - 因为tbl_Rank的
ExpLeague和Rank列已经设置了默认约束(分别是0和'Bronze III'),所以插入时不需要指定这两列,数据库会自动帮你填好默认值。 SET NOCOUNT ON;是个好习惯,能避免返回不必要的“受影响的行数”消息,让存储过程的输出更干净。
怎么用这个存储过程
直接执行下面的语句就能运行:
EXEC dbo.sp_InsertIntoRankFromBase;
额外优化建议
如果担心重复插入同一个角色(比如tbl_base里的记录可能更新后再次触发插入),可以给插入语句加个去重判断,用NOT EXISTS确保只有tbl_Rank里没有的记录才会被插入:
INSERT INTO dbo.tbl_Rank (Name, Lv) SELECT b.NameCharacter, b.Level FROM dbo.tbl_base b WHERE b.Level > 39 AND NOT EXISTS ( SELECT 1 FROM dbo.tbl_Rank r WHERE r.Name = b.NameCharacter AND r.Lv = b.Level );
这样就不会出现重复数据啦。
内容的提问来源于stack exchange,提问作者nova tria
相关产品推荐
相关产品推荐

