sql - 为什么不能动态设置列的别名?
问题描述
我有一个存储过程,我想将列别名作为参数传递,例如:
SELECT u.userLoginName AS @columnName
FROM -- some JOINs
WHERE -- some conditions
where@columnName
可以是两个选项之一,并且根据某些条件在 SELECT 语句之前设置。我已经知道它只能通过动态SQL来完成,但我不明白为什么?
我知道查询的执行顺序是:FROM 和 JOINs -> WHERE -> GROUP BY,然后是 SELECT。
因此,如果此时我已经得到了结果集,即压轴表,为什么我不能将列名重命名为@columnName
?我想念的背景会发生什么?
解决方案
这可能会回答你的问题。
SQL 结果集在概念上就像一个表:它具有明确定义的行和列,并且没有排序,除非使用显式创建order by
.
SQL 查询分两个阶段处理:编译和优化,然后运行。(令人高兴的是,一些数据库现在也开始提供动态优化,但查询仍处于编译阶段。)
在编译阶段需要知道关于结果集的所有信息——包括生成的列名和列类型。动态名称将防止这种情况发生。他们只会在执行阶段才知道。
请注意,这也适用于作为标识符的参数。参数在执行阶段开始时被替换。
这不是任何特定数据库的限制。它适用于所有人。我怀疑一些更现代的数据库是以允许更多动态命名的方式实现的,但我不知道除了通过动态 SQL 之外实际实现它的任何数据库。
推荐阅读
- c# - 如何返回带有集合的对象,而不仅仅是来自 Web API 的集合?
- python - 如何使用 django 在我的网站中添加类别?
- php - PHP/Laravel 在哪里放置使用 2 个或更多服务的逻辑
- c# - 当 GC 处于 LowLatency 模式时,C# TryStartNoGCRegion 'NoGCRegion 模式已在进行中'异常
- javascript - 我已经从数组中渲染了一些虚拟数据,但是当我尝试更新它然后动态渲染它时,它出错了。我在下面有代码
- python - 如何将 pb 文件转换为 tf lite?
- android - 从 url-valued 对象中获取 JSON 对象
- dashboard - 我如何创建一个合适的金融银行仪表板
- spring-boot - spring boot i 文本错误
- linux - 如何使用 C 可执行文件运行 app_armor 配置文件