使参数值为没有动态SQL的列名

时间:2015-09-24 14:22:43

标签: sql sql-server parameters ssms

有没有办法在不使用动态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

7 个答案:

答案 0 :(得分:2)

一种丑陋的方式,没有Dynamic-SQL正在使用临时表并重命名列:

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;

答案 1 :(得分:1)

您需要使用动态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;

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

答案 2 :(得分:1)

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

动态SQL(创建一个新的查询,带有一个新的编译步骤,其中表和列名称是预先知道的)将是实现此目的的唯一方法。

答案 3 :(得分:0)

答案是“不”。根据定义,动态SQL意味着代码可以自行更改。动态SQL的唯一替代方法是硬编码SQL,这是您自己专门编写每个部分的时候。

您问是否可以根据变量更改字段名称,这只能使用动态SQL来完成。

答案 4 :(得分:0)

除非您重命名应用程序中的列,否则这就是我的方式。

DECLARE @input VARCHAR(10)=' Person '; 
Declare @sql varchar(max);
set @sql'SELECT count(*) as ['+ @input +' Open Data]
FROM #Accounts a
JOIN dbo.FileFeed t On t.ID = a.AccountID     
GROUP BY a.accountid';

EXEC(@sql);

答案 5 :(得分:0)

IF 情况是@input变量/参数中的值可以是有限的(即不是开放式用户输入或那种性质的东西),那么没有DynamicSQL就可以做到这一点。您只需要在此存储过程中拥有多个查询副本,每个副本除了列的别名之外完全相同,然后根据变量的值选择所需的副本。例如:

DECLARE @input VARCHAR(10)=' Person '; 

IF (@input = 'Person')
BEGIN
  SELECT COUNT(*) AS [Person Open Data]
  FROM #Accounts a
  JOIN dbo.FileFeed t
    ON t.ID = a.AccountID     
  GROUP BY a.accountid;
END;

IF (@input = 'Account')
BEGIN
  SELECT COUNT(*) AS [Account Open Data]
  FROM #Accounts a
  JOIN dbo.FileFeed t
    ON t.ID = a.AccountID     
  GROUP BY a.accountid;
END;

...

答案 6 :(得分:0)

如果您有更高版本的SQL Server,那么您可以查看以下选项:

EXEC <stored_procedure> WITH RESULT SETS (...)

我想你已经在使用存储过程了。这样,您至少可以在第二个过程中保持主逻辑完全静态,并且只需通过动态exec调用接口来完成列的重命名。