码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MS SQL变更及字段更新顺序问题


    思考

    如果在更新语句中引用到变量,并且在更新语句中对变量赋值,更新后的值将如何变化?另外变量与字段的更新顺序又是怎样的呢?

    探索

    创建表并插入数据,声明变量,在更新语句中对变量及字段进行变更:

    1. DECLARE @t TABLE(seq INT IDENTITY, a INT,b INT,c INT, d INT,e INT)
    2. INSERT @t VALUES (0,0,0,0,1),(0,0,0,0,2),(0,0,0,0,3),(0,0,0,0,4),(0,0,0,0,5)
    3. SELECT * FROM @t
    4. DECLARE @n INT=1
    5. UPDATE @t SET a=@n,@n=@n+1,b=@n,c=(SELECT @n),d=e,e=d
    6. SELECT * FROM @t

    结果如图所示:

     此时发现a、b两列的值是一样的,更新语句中对变量的赋值位置不会影响到更新的值,而d、e两列的内容互换了。但是采购子查询更新的c列内容全部是变量的初始值。说明子查询被优化了,只计算了一次?

    通过此次示例可以看到计算的顺序是先算子查询,而且子查询中的变量不会改变,然后每行会先更新变量值,再更新字段值。

    那如果子查询中要根据不同的变量值来获取不同的值怎么办呢?

    根据实践,只有采用函数来处理,才会实现针对不同变更值获取不同返回内容。

    先创建函数,示例中仅简单地返回原来的值:

    1. CREATE FUNCTION GetN
    2. (
    3. @N INT
    4. )
    5. RETURNS INT
    6. AS
    7. BEGIN
    8. RETURN @N;
    9. END;
    10. GO

    然后在更新语句中调用此函数:

    1. SET @n =1
    2. UPDATE @t SET a=@n,@n=@n+1,b=dbo.getn(@n),c=(SELECT @n),e=b,d=e
    3. SELECT * FROM @t

    此时的结果如下:

     此时b列是通过函数调用生成的,c列仍然是子查询,可以看到b列的结果同样是在变量更新后调用的子查询值,如果将变更的赋值放到b列赋值的后面结果也是一样的。

    所以顺序仍然是先变量、后函数和字段。但函数和字段赋值的顺序又是什么样子呢?

    两次修改更新语句如下:

    1. DECLARE @n INT=1
    2. UPDATE @t SET a=dbo.getn(@n),@n=@n+1,b=dbo.getn(@n),c=(SELECT @n),e=c,d=a
    3. SELECT * FROM @t

    此次将d列的值更新为a列的值,e的值更新为c的值,a列的值更新为函数的值,可以看到字段的赋值在函数和子查询之前了:

    结论 

    所以优先顺序为变量>字段(所有字段同时更新)>子查询和函数。

    字段同时更新其实是因为更新是有一个Deleted临时表,里面记录了原始值,所以看上去是同时更新的。

  • 相关阅读:
    基于java+springmvc+mybatis+vue+mysql的水果食品果蔬生鲜商城销售系统
    【动态规划】—— 背包问题
    API接口测试工具为什么尤其重要
    华为机考:HJ3 明明的随机数
    SaaSBase:什么是企域数科?
    GPT-4 及更高版本:大型语言模型的力量
    transforms.normalize如何对特定数据集设定标准化参数
    分享一种非隔离控制三象限双向可控硅的产品级电路
    手写一个简单的web服务器(B/S架构)
    java毕业设计——基于java+Servlet+jsp的网上花店销售系统设计与实现(毕业论文+程序源码)——网上花店销售系统
  • 原文地址:https://blog.csdn.net/apollokk/article/details/126500634
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号