首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将参数的值设置为不带动态SQL的列名。

将参数的值设置为不带动态SQL的列名。
EN

Stack Overflow用户
提问于 2015-09-24 14:22:42
回答 7查看 2.5K关注 0票数 2

是否有一种方法可以在不使用动态SQL的情况下将参数中的值命名为列?

我需要将@input参数中的值作为SQL语句中列的名称输出。我需要避免使用动态SQL。

代码语言:javascript
运行
复制
DECLARE @input VARCHAR(10)=' Person '; 

SELECT count(*) AS  @input + ' Open Data'    
FROM #Accounts a
JOIN dbo.FileFeed t On t.ID = a.AccountID     
GROUP BY a.accountid
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-09-24 14:29:33

您需要使用动态SQL:

代码语言:javascript
运行
复制
DECLARE @input VARCHAR(10) = ' Person '; 

DECLARE @sql NVARCHAR(MAX) = '
SELECT count(*) AS  [@Input Open Data]    
FROM #Accounts a JOIN
     dbo.FileFeed t
     On t.ID = a.AccountID     
GROUP BY a.accountid';

SET @sql = REPLACE(@sql, '@Input', @Input);

exec sp_executesql @sql;

然而,我并不认为这是一个好主意。如果需要重命名列,请在应用程序代码中这样做。

票数 1
EN

Stack Overflow用户

发布于 2015-09-24 14:30:59

在没有的情况下,使用临时表和重命名列是一种丑陋的方式:

代码语言:javascript
运行
复制
DECLARE @input VARCHAR(10) = ' Person '; 
DECLARE @new_name VARCHAR(100) = @input + ' Open Data';

SELECT [rename_me] = COUNT(*)
INTO #temp    
FROM #Accounts a
JOIN dbo.FileFeed t On t.ID = a.AccountID     
GROUP BY a.accountid;

EXEC tempdb..sp_rename '#temp.rename_me', @new_name, 'COLUMN';

SELECT * 
FROM #temp;
票数 2
EN

Stack Overflow用户

发布于 2015-09-24 14:31:46

不是的。数据库使用类似于编译的过程将查询转换为执行计划。此过程的一部分涉及确定运行查询的用户是否具有访问查询所使用的表和列的权限。如果这些表和列直到执行时才确定,则编译步骤无法完成。这似乎很奇怪,但同样的事情也适用于结果集。

动态SQL (它创建一个新的查询,并在新的编译步骤中预先知道表和列名)将是实现这一目标的唯一方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32763862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档