是否有一种方法可以在不使用动态SQL的情况下将参数中的值命名为列?
我需要将@input
参数中的值作为SQL语句中列的名称输出。我需要避免使用动态SQL。
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
发布于 2015-09-24 06:29:33
您需要使用动态SQL:
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;
然而,我并不认为这是一个好主意。如果需要重命名列,请在应用程序代码中这样做。
发布于 2015-09-24 06:30:59
在没有的情况下,使用临时表和重命名列是一种丑陋的方式:
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;
发布于 2015-09-24 06:31:46
不是的。数据库使用类似于编译的过程将查询转换为执行计划。此过程的一部分涉及确定运行查询的用户是否具有访问查询所使用的表和列的权限。如果这些表和列直到执行时才确定,则编译步骤无法完成。这似乎很奇怪,但同样的事情也适用于结果集。
动态SQL (它创建一个新的查询,并在新的编译步骤中预先知道表和列名)将是实现这一目标的唯一方法。
https://stackoverflow.com/questions/32763862
复制相似问题