有关。例如,
问题:
@declare @columnName as nvarchar(10)='2015'
select 1 as [Rank in @columnName]
预期输出:
------------------
| Rank in 2015 |
------------------
| 1 |
------------------
编辑:我很乐意不使用动态SQL,如果它不是唯一的选择
编辑:
我从sql这样做的原因是我没有这样的前端。
我们实际上正在向用户提供数据,这些用户也是前端开发人员,然后他们可能会使用该数据并构建自己的界面,考虑到我想要发布本身有意义的数据集,而不必明确提及。
我希望你明白了。
答案 0 :(得分: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,我强烈建议你习惯sp_executesql
仅仅exec
- 它允许你将参数传入和传出执行环境。除了有用之外,这有助于防止SQL注入攻击。
那就是说,我认为你应该给列通用名称,并在运行查询的任何应用程序中处理列命名。听起来像列标题的选择是为了满足一些用户。他们可能会变幻无常并改变主意,或者不同的用户可能需要不同的列标题。在应用程序层处理此问题意味着此类更改不需要更改SQL代码。而且,从长远来看,更多的本地化变革更安全。
答案 1 :(得分:0)
你可以在下面做,但它是动态SQL:
DECLARE @columnName NVARCHAR(10) = '2015]'
EXEC ('SELECT ''1'' AS [Rank in ' + @columnName)