2015-06-09 99 views
1

我有一些奇怪的要求。我需要串联字符串作为ms-sql中的列别名。列别名中的连接字符串

对于。例如,

问题:

@declare @columnName as nvarchar(10)='2015'  
select 1 as [Rank in @columnName] 

预期输出:

------------------ 
| Rank in 2015 | 
------------------ 
|  1  | 
------------------ 

编辑:我会很乐意不要使用动态SQL做它,如果它不是只有选件

编辑:

我从sql做这个的原因是我没有这样的前端。

我们实际上正在向用户提供数据,这些用户又是前端开发人员,他们可能会使用这些数据并构建他们自己的界面,考虑到我想发布的数据集本身就有意义而不必提及它明确。

我希望你有这个想法。

+5

No way ............创建动态sql –

+0

查看示例查询,我可以冒险想要在此处进行旋转的猜测,例如, http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx – HingeSight

回答

1

下面是一个合理的解决方案:

declare @columnName nvarchar(10) = '2015'; 
declare @sql nvarchar(max) = 'select @value as ' + quotename('Rank in ' + columnName); 

exec sp_executesql @sql, N'@value int', @value = @value; 

多一点的时间讨论。如果您要根据现有列名称获取新列名称,则需要在查询中修改更多内容。对于动态SQL,我强烈建议您仅在exec之前熟悉sp_executesql--它允许您将参数传入和传出执行环境。除了有用之外,这有助于防范SQL注入攻击。

这就是说,我认为你应该给列通用名称和处理列命名在任何应用程序正在运行查询。这听起来像列标题的选择是为了满足一些用户。他们可能会变得浮躁并改变主意,或者不同的用户可能需要不同的列标题。在应用层处理这个问题意味着而不是需要更改SQL代码。而且,从长远来看,更多的本地化变更更安全。

+0

我知道这个解决方案,但现在它更具说服力,谢谢你。很好地说。 +1 –

0

你能做到在下面,但它的动态SQL:

DECLARE @columnName NVARCHAR(10) = '2015]' 
EXEC ('SELECT ''1'' AS [Rank in ' + @columnName)