Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么不能动态设置列的别名?_Sql_Sql Server_Stored Procedures - Fatal编程技术网

Sql 为什么不能动态设置列的别名?

Sql 为什么不能动态设置列的别名?,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我有一个存储过程,希望将列别名作为参数传递,例如: SELECT u.userLoginName AS @columnName FROM -- some JOINs WHERE -- some conditions 其中@columnName可以是两个选项之一,并根据某些条件在SELECT语句之前设置。 我已经知道只有动态SQL才能做到这一点,但我不明白为什么 我知道查询的执行顺序是:FROM和JOINs->WHERE->groupby,然后选择 因此,如果此时我已经得到了结果集,即最终表,为

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

SELECT u.userLoginName AS @columnName
FROM -- some JOINs
WHERE -- some conditions
其中@columnName可以是两个选项之一,并根据某些条件在SELECT语句之前设置。 我已经知道只有动态SQL才能做到这一点,但我不明白为什么

我知道查询的执行顺序是:FROM和JOINs->WHERE->groupby,然后选择


因此,如果此时我已经得到了结果集,即最终表,为什么我不能将列名重命名为@columnName?在我错过的背景中发生了什么?

这也许可以回答你的问题

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

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

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

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


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

这可能回答了您的问题

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)

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

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)

注意,查询本身必须是动态的,因为SQL不是脚本语言。它不像Powershell那样支持注入参数来表示对象、名称等。SQL语句必须定义良好,并且不能用参数/变量替换需要文本的查询部分。您希望动态更改列名这一事实意味着您在此处有一个名称。这不仅仅是发生在Microsoft的SQL Server中,更具体地说是发生在t-SQL方言@DaleK中。其他SQL语言通常不支持用变量替换文字,我想不出有哪种语言支持,但我并不奇怪有这样的语言。如果他们这样做了,就不会遵循标准行为。注意,您可以使用动态SQL动态设置列名。但是,如果您只想动态更改列的别名,那么这肯定不是数据引擎的任务,应该在您的表示层中,因为SQL不是脚本语言。它不像Powershell那样支持注入参数来表示对象、名称等。SQL语句必须定义良好,并且不能用参数/变量替换需要文本的查询部分。您希望动态更改列名这一事实意味着您在此处有一个名称。这不仅仅是发生在Microsoft的SQL Server中,更具体地说是发生在t-SQL方言@DaleK中。其他SQL语言通常不支持用变量替换文字,我想不出有哪种语言支持,但我并不奇怪有这样的语言。如果他们这样做了,就不会遵循标准行为 。注意:您可以使用动态SQL动态设置列的名称。但是,如果您只想动态更改列的别名,那么这肯定不是数据引擎的任务,应该在您的表示层中。