首页 > 解决方案 > 为什么不能动态设置列的别名?

问题描述

我有一个存储过程,我想将列别名作为参数传递,例如:

SELECT u.userLoginName AS @columnName
FROM -- some JOINs
WHERE -- some conditions

where@columnName可以是两个选项之一,并且根据某些条件在 SELECT 语句之前设置。我已经知道它只能通过动态SQL来完成,但我不明白为什么?

我知道查询的执行顺序是:FROM 和 JOINs -> WHERE -> GROUP BY,然后是 SELECT。

因此,如果此时我已经得到了结果集,即压轴表,为什么我不能将列名重命名为@columnName?我想念的背景会发生什么?

标签: sqlsql-serverstored-procedures

解决方案


这可能会回答你的问题。

SQL 结果集在概念上就像一个表:它具有明确定义的行和列,并且没有排序,除非使用显式创建order by.

SQL 查询分两个阶段处理:编译和优化,然后运行。(令人高兴的是,一些数据库现在也开始提供动态优化,但查询仍处于编译阶段。)

在编译阶段需要知道关于结果集的所有信息——包括生成的列名和列类型。动态名称将防止这种情况发生。他们只会在执行阶段才知道。

请注意,这也适用于作为标识符的参数。参数在执行阶段开始时被替换。

这不是任何特定数据库的限制。它适用于所有人。我怀疑一些更现代的数据库是以允许更多动态命名的方式实现的,但我不知道除了通过动态 SQL 之外实际实现它的任何数据库。


推荐阅读