点击蓝色“有关SQL”关注我哟
加个“星标”,天天与10000人一起快乐成长
图 | 榖依米
炎炎夏日,赖以续命的空调,又被禁开。
一大帮子的开发,窝在一处办公,想想这酸爽,谁见谁愁。L 早已下楼去星巴克加冰了,剩下小 C 在对付 同样焦灼的 Support.
不知道是天气闷热,还是午饭太丰盛,脑袋不能很快回血的小 C,眼睛虽然盯着屏幕,心神却怕早已见了周公。
看到此景,L 真的害怕,被困神骚扰的小 C 鼠标一点,一划拉,整个库都拜拜了。
于是 L 走上前去,把星冰乐轻轻放在小 C 屏幕前,看到小 C 虎躯一震,大概是被微微凉意,拉了回来。“可以说事了”,L 心想。
“什么难题,让你这么纠结”
“好奇怪。这段脚本我检查了 10 几遍,眼睛都花了。但就是找不出问题”
看到 1800 多行的 SQL 代码,仅仅是翻屏,都点了好几下。L 也是哭笑不得。
“快速定位出错的 SQL 语句,其实是有妙招的” L 吸一口咖啡,满脸开心。
“从上到下,慢慢看咯,还能怎么办?”
“二分法” L 吸着冰焦玛,似乎被奶油给腻着了,后半句话还没说出来,就被小C抢过话题。
“这还和算法有关系?”
“如果代码太长,你脑袋的缓存没那么大,那就需要缩短查找范围。比如看前 900 行。如果前 900 行没问题,再往下看 500 行”
“太绝了” 小 C 就像看到了冰奶茶一样狂喜,CTRL + G 定位到 1000 行处,接着 CTRL + SHIFT + HOME,F5 一刷,问题来了。
“就是这个临时表,我在每段 batch 开头都 Drop 了下,接着创建,结果老提示 there is already an object named #AccountList ”
"所以,归纳起来就是这样的模式错了" L 把相关的临时表创建代码,复制出来,运行了一把

当然每段中间还有其他的操作,这里省去了。
看到 L 运行也报错,小 C 总算送了口气。接下来,盯着 L 圆圆的脑袋,心里一万个问号,飘过.
“上次给你的 sql server exeuction plans 那本书,看了没?”
“没看那么快,太多原理性的东西了”
“SQL 的执行路径,能解释这里的问题”

“SQL 在执行前,一定会通过 4 个大步骤。而这里的问题,在于 Parsing.”

“即使我们不执行 SQL, 只要执行这里打钩的命令,就可以知道 SQL 能否正确运行”
果然,还是那个错误。小C看着 SSMS,仿佛见到一个新来的生物一样。
“这里建两次同名的表,虽然有 Drop 语句,但 parsing 阶段,并不执行。只是验证 SQL 语句的语法是否正确。我来举个反例。明明是错误的代码, 却能 parsing ”
"你看,这个 #AccountList 临时表不存在吧"

"但是不耽误它 parsing 成功"

“ WOW, ” 小 C 惊喜,“想不到这里头还有这样的道道,学到了”
L 拿起半杯星冰乐,满意地大步走向自己的 cube.
--完--
往期精彩: