如您所见,“为什么”问题需要不同的回答,包括历史依据和语言的基本假设,我不确定我是否真的可以做到这一点。
SQL MVP Erland Sommarskog撰写的这篇综合文章确实试图提供一些基本原理以及机制:
动态SQL的诅咒和祝福:
缓存查询计划
您在SQL Server中运行的每个查询都需要一个查询计划。首次运行查询时,SQL Server会为其构建查询计划(或者按照术语进行),它将编译查询。SQL Server将计划保存在缓存中,并且下次您运行查询时,将重用该计划。
这(和安全性,请参见下文)可能是最大的原因。
SQL操作的前提是查询不是一次性操作,而是将反复使用它们。如果未在查询中实际指定表(或数据库!),则它无法生成和保存执行计划以备将来使用。
是的,不是我们运行的每个查询都会被重用,但这是SQL的默认操作前提,因此“ exceptions”是例外。
Erland列出了其他一些原因(请注意,他明确列出了使用存储过程的优点,但是其中许多也是参数化(非动态)查询的优点):
- 权限系统:如果SQL引擎不知道您要操作的表(或数据库),则SQL引擎无法预测您是否有权运行查询。使用动态SQL的“权限链”是一个麻烦。
- 减少网络流量:通过网络传递存储的proc的名称和一些参数值比长查询语句短。
- 封装逻辑:您应该熟悉来自其他编程环境的封装逻辑的优点。
- 跟踪使用的内容:如果需要更改列定义,如何找到所有调用它的代码?存在系统过程来查找SQL数据库中的依赖关系,但前提是代码在存储过程中。
- 易于编写SQL代码:创建或修改存储过程时会进行语法检查,因此希望产生的错误更少。
- 解决错误和问题:与不断变化的动态SQL相比,DBA可以更轻松地跟踪和衡量单个存储过程的性能。
再说一次,这些中的每一个都有一百个细微差别,我将不在这里介绍。