我有一个存储过程,我想传递一个列别名作为参数,类似于:
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)
请注意,查询本身必须是动态