缓存update delete 一致性的处理,SQLSERVER修改后获取修改的数据内容

本文分享了使用数据层统一管理缓存时,针对INSERT、DELETE和UPDATE操作的SQL技巧,包括返回插入、删除和更新前后数据的方法,以及将返回结果保存在表变量中的实用策略。

使用数据层统一管理缓存的时候遇到一个问题就是update delete 的缓存处理

思考,查找,寻求到了一个解决办法分享如下:

1、插入数据,并返回插入的数据:

INSERT INTO TestTB(Province,City)
output inserted.Province, inserted.City
VALUES('广东','深圳')

执行后返回的结果:

2、同理,删除数据也是一样的,只不过是使用deleted表罢了。

delete from TestTB
output deleted.*
where id=1

返回结果:

 

3、两个结合一起:返回更新前和更新后的数据:

UPDATE TestTB SET Province = '湖南',City='郴州'
OUTPUT '我来自(更新前)'+ DELETED.Province+DELETED.City as [Before] ,'我来自(更新后)' + Inserted.Province+Inserted.City as [After]
WHERE id=1

返回结果:

 

4、还可以将返回的结果保存在表变量中,这在删除数据,并把删除的数据插入到历史表时很实用

复制代码

DECLARE @tempTable TABLE(
    id int,
    Province varchar(50),
    City varchar(50) 
) 
DELETE FROM TestTB OUTPUT deleted.* INTO @tempTable
WHERE id > 4
 
SELECT  * FROM @tempTable

感谢作者 

https://www.cnblogs.com/liuxinhuahao/p/3928052.html  活学活用

<think>嗯,用户想了解SQL Server中T-SQL数据处理逻辑的开发方法,这需要系统性地梳理核心概念和开发流程。从用户的问题描述来看,ta应该是有一定SQL基础但想深入理解T-SQL的编程范式,特别是过程化处理的部分。 注意到用户提供的引用材料里提到T-SQL包含过程语言元素,比如变量、流程控制等,这确实是关键切入点。用户可能在实际开发中遇到了需要编写复杂业务逻辑的情况,单纯的查询语句已经不够用了。 首先需要区分T-SQL和标准SQL的差异点:T-SQL扩展了变量声明、条件分支、错误处理等过程化能力。在开发逻辑上,典型场景包括存储过程编写、事务控制、游标操作等。用户可能特别需要知道如何把业务规则转化为可靠的T-SQL代码结构。 考虑到用户可能是中级开发者,应该避免过于基础的语法讲解,重点放在设计模式上。比如何时使用临时表替代游标,如何通过TRY-CATCH构建健壮的批处理。引用材料中提到的datetime存储机制也提示我们可以举例说明数据类型选择对逻辑的影响——比如用smalldatetime节省空间时要注意精度损失可能引发的业务逻辑错误。 用户没有具体说明应用场景,但根据经验,这类需求常出现在报表生成或数据清洗任务中。可以预设一个典型场景:需要循环处理订单数据并逐级汇总。这时就需要演示如何用WHILE循环配合临时表实现,同时强调基于集合的操作通常优于逐行处理。 在安全方面要提醒参数化查询防注入,性能方面则要解释执行计划分析。用户可能没意识到这些也属于数据处理逻辑的重要环节。最后生成的问题要覆盖用户可能延伸的疑问点,比如事务隔离级别对逻辑的影响——这是实际开发中容易踩坑的地方。</think>以下是SQL Server中T-SQL数据处理逻辑开发的系统方法,结合过程化编程与声明式SQL特性实现高效可靠的数据操作: ### 一、核心开发逻辑框架 1. **批处理与脚本组织** ```sql USE YourDatabase; -- 切换数据库上下文 GO -- 批处理分隔符[^1] ``` 批处理是T-SQL执行的基本单位,`GO`分隔多个逻辑块,每个批处理独立编译执行。 2. **变量与数据类型控制** ```sql DECLARE @StartDate DATETIME = '2023-01-01' -- 日期变量声明 DECLARE @ItemCount INT -- 整数变量 SET @ItemCount = (SELECT COUNT(*) FROM Orders WHERE OrderDate >= @StartDate) ``` 严格匹配数据类型(如`smalldatetime`精度为分钟级,`datetime`精度3.33毫秒[^2])避免隐式转换开销。 3. **流程控制结构** ```sql IF @ItemCount > 1000 BEGIN PRINT '执行批量处理流程'; EXEC usp_ProcessLargeData; -- 调用存储过程 END ELSE RAISERROR('数据量不足', 16, 1); -- 错误处理 ``` `BEGIN...END`定义语句块,`WHILE`循环处理分页数据。 ### 二、高效数据处理模式 1. **基于集合的操作** ```sql UPDATE t SET t.Price = s.NewPrice FROM Products t INNER JOIN PriceUpdates s ON t.ProductID = s.ProductID WHERE s.EffectiveDate <= GETDATE(); ``` 优先使用`JOIN`替代游标(Cursor),减少上下文切换开销。 2. **事务与错误处理** ```sql BEGIN TRY BEGIN TRANSACTION; DELETE Orders WHERE OrderStatus = 'Canceled'; UPDATE Inventory SET Stock = Stock + 1; COMMIT TRANSACTION; END TRY BEGIN CATCH ROLLBACK TRANSACTION; THROW; -- SQL Server 2012+错误传递 END CATCH ``` 通过`TRY...CATCH`确保数据一致性,事务日志写入影响性能需权衡[^1]。 3. **临时数据存储** ```sql SELECT * INTO #TempOrders -- 局部临时表 FROM Orders WHERE OrderDate > DATEADD(DAY, -30, GETDATE()); DECLARE @TableVar TABLE (ID INT); -- 表变量 INSERT INTO @TableVar VALUES (1),(2); ``` 临时表(`#`前缀)适合大数据集,表变量适合小规模中间数据。 ### 三、性能优化关键点 1. **参数嗅探问题** ```sql CREATE PROC usp_GetOrders @CustomerID INT WITH RECOMPILE -- 避免执行计划缓存问题 AS ... ``` 使用`OPTION(RECOMPILE)`或`WITH RECOMPILE`解决参数化查询性能抖动。 2. **索引策略** ```sql CREATE NONCLUSTERED INDEX IX_OrderDate ON Orders(OrderDate) INCLUDE (TotalAmount); ``` `INCLUDE`列避免键查找,统计信息更新频率影响计划准确性。 3. **批处理模式** ```sql WHILE @PageNum <= @TotalPages BEGIN DELETE TOP (1000) FROM LogTable WHERE CreateDate < DATEADD(YEAR, -1, GETDATE()); SET @PageNum += 1; END ``` 大数量操作分批次提交,减少锁竞争和日志增长。 ### 四、开发最佳实践 1. **模块化设计** - 存储过程封装业务逻辑 - 函数实现可重用计算(标量函数/表值函数) - 视图抽象数据访问层 2. **资源监控** ```sql SET STATISTICS IO, TIME ON; -- 查看IO和时间消耗 EXEC YourProcedure; ``` 结合`sys.dm_exec_query_stats`分析历史执行性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值