为什么无法动态设置列的别名?



我有一个存储过程,我想传递一个列别名作为参数,类似于:

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

其中CCD_ 1可以是两个选项中的一个,并且它是根据某些条件在SELECT语句之前设置的。我已经知道只有动态SQL才能做到这一点,但我不明白为什么

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

那么,如果在这一点上我已经得到了结果集,即压轴表,为什么我不能将列名重命名为@columnName呢?我怀念的背景发生了什么?

这可能会回答您的问题。

SQL结果集在概念上就像一个表:它有定义良好的行和列,除非使用显式order by创建,否则没有排序。

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

在编译阶段,需要知道有关结果集的所有信息,其中包括生成的列名和列类型。动态名称可以防止这种情况发生。只有在执行阶段才能知道它们。

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

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

这是可能的,但您必须使用动态查询。假设我们有下表

Create table #TBL ([Months] VARCHAR(3), Value INT)
INSERT INTO #TBL values
('Jan',20),('Feb',12),('Jan',15),('Mar',25),
('Feb',18),('Jan',9),('Mar',10),('Jan',19)
GO

我想使用变量动态设置列名。我可以使用以下代码

DECLARE @M VARCHAR(10)='Months',
@T VARCHAR(10)='Total'
-- Dynamic query to get the column name
DECLARE @qry VARCHAR(MAX)
SET @qry = 'SELECT  [Months] AS '+@M+',
sum(Value) as '+@T+'    
FROM #TBL
group by [Months]
DROP TABLE #TBL'
EXEC (@qry)

请注意,查询本身必须是动态