谨记初始化变量
最近又被开发的小伙坑了,先看一个测试样例

--创建表并插入测试数据 CREATE TABLE ConfigForAll(KindID INT,TTable VARCHAR(64),FTable VARCHAR(64)) INSERT INTO ConfigForAll VALUES(1,'AdventureWorks2008R2.Sales.SalesOrderDetail','AdventureWorks2008R2.Sales.SalesOrderDetail') ,(2,'AdventureWorks2008R2.Sales.SalesOrderHeader','AdventureWorks2008R2.Sales.SalesOrderHeaderXXX') ,(3,'AdventureWorks2008R2.Sales.SalesOrderHeaderSalesReason','AdventureWorks2008R2.Sales.SalesOrderHeaderSalesReason') GO
配置表中保存有需要统计行数的表名,TTable列全为正确表名,FTable列包含部分错误表名

--游标计算表中记录数(仅用于模拟,不考虑效率) DECLARE @KindID INT DECLARE @TTable VARCHAR(64) DECLARE @FTable VARCHAR(64) DECLARE loop_cursor CURSOR FOR SELECT KindID,TTable,FTable FROM ConfigForAll ORDER BY KindID OPEN loop_cursor FETCH NEXT FROM loop_cursor INTO @KindID,@TTable,@FTable WHILE @@FETCH_STATUS = 0 BEGIN DECLARE @TCount INT DECLARE @FCount INT --SELECT @TCount=0,@FCount=0 --没有初始化变量 DECLARE @sql NVARCHAR(MAX) DECLARE @sql_out NVARCHAR(MAX) --正确表名 SET @sql='SELECT @TCount=count(*) FROM '+@TTable+' WITH(NOLOCK)' PRINT @sql SET @sql_out='@TCount INT output' EXEC sp_executesql @sql,@sql_out,@TCount OUTPUT --错误表名 SET @sql='SELECT @FCount=count(*) FROM '+@FTable+' WITH(NOLOCK)' PRINT @sql SET @sql_out='@FCount INT output' EXEC sp_executesql @sql,@sql_out,@FCount OUTPUT --计算结果 SELECT @KindID KindID,@TCount TCount,@FCount FCount FETCH NEXT FROM loop_cursor INTO @KindID,@TTable,@FTable END CLOSE loop_cursor DEALLOCATE loop_cursor
使用游标逐行计算表中的记录数,执行消息和结果如下
1、执行过程有报错(对象名 'AdventureWorks2008R2.Sales.SalesOrderHeaderXXX' 无效。)
2、仅报错的行结果有误,后续行将继续执行。数据表不存在,变量值实际还是前一条记录的结果
真实环境有点类似,不同Game保存在不同的表,然后对各个Game统计多项指标。因此存在一张配置表,通过KindID区分Game,不同的指标需从不同的表格获取数据(配置多列)。
向开发反馈,配置表中的表在库中不存在;结果他说知道不存在,出错会终止?让他去看这两天的统计数据,然后他说去掉...
好小伙,发现他所说的去掉,就是把配置表中的那个单元置为''。依旧使用测试数据,"去掉"等效于
UPDATE ConfigForAll SET FTable='' WHERE KindID=2
然后使用开篇的游标语句,结果一样,执行消息稍有不同
这不是从一个坑跳入另一个坑!原本想简单粗暴点直接从配置表删除对应记录,那样其他指标与XXX表无关的统计都没了。最后采用NULL+String为NULL
UPDATE ConfigForAll SET FTable=NULL WHERE KindID=2
同时游标内声明变量后进行初始化操作!
真实环境的语句太惨不忍睹,各种嵌套,多行记录赋值给一个变量,部分还有with(index=index_name),一旦配置表中添加的数据表没有创建对应的索引,统计跟着死翘翘⊙0⊙
|
【作者】: 醒嘞 |
【出处】: http://www.cnblogs.com/Uest/ | |
【声明】: 本文内容仅代表个人观点。如需转载请保留此段声明,且在文章页面明显位置给出原文链接! |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2015-05-25 【译】第六篇 SQL Server代理深入作业步骤工作流