回答
它知道什么之前的@a的价值是你不能这样做,因为SQL编译(我假设在现实中你会希望@a是一些参数并不像你的例子那样硬编码)。
相反,你可以这样做:
declare @a as varchar;
set @a='TEST'
declare @sql nvarchar(max)
set @sql = 'select [' + replace(@a, '''', '''''') + '] from x'
exec sp_executesql @sql
但要注意,这是一个安全漏洞(SQL注入攻击),所以如果你不能信任或好干净@a不应该做的。
因为列名在运行时的SQL语句在编译时决定不。
使用sp_executesql
这
Example
SET @SQLString = N'SELECT *
FROM table1
WHERE timet = @time and items in (@item)';
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
SET @ParmDefinition = N'@time timestamp,
@item varchar(max) ';
EXECUTE sp_executesql
@SQLString
,@ParmDefinition
,@time = '2010-04-26 17:15:05.667'
,@item = '''Item1'',''Item2'',''Item3'',''Item4'''
;
因为这是不允许的。
insted的这个,你可以使用动态SQL查询:
declare @a as varchar;
set @a='TEST'
exec ('select ' + @a + ' from x')
的问题是为什么不允许,而不是如何解决它。我无法看到回答“因为它是不允许的”是非常有帮助的。 – 2010-04-28 07:06:40
@David M:是的,这只是一个解决方法。你的回答是有帮助的 – Alex 2010-04-28 07:14:44
感谢'exec' - 它比'exec sp_executesql'更容易记住等等等等。我记得总是在这个SP中出现错误,比如“不允许执行这个程序”。 – 2015-06-12 22:49:10
- 1. SQL Server中的变量名称
- 2. SQL Server行名称增量
- 3. SQL Server存储过程 - 基于变量名称更新列。
- 4. SQL Server +变量查找中的变量表名称
- 5. SQL Server - 列名作为变量
- 6. sql添加变量名称列
- 7. 按列名称分组的SQL变量
- 8. SQL符号/变量名称
- 9. 使用SQL Server 2012批量重命名列名称
- 10. 常量数据库名称在SQL Server
- 11. VBA:变量名称阵列
- 12. 给列表变量名称
- 13. 变量列表名称
- 14. 在MS Sql Server 2016中声明服务器名称为变量
- 15. 对于XML SQL Server - 输出XML中的变量元素名称
- 16. 在sql server中创建带变量名称的数据库
- 17. 在SQL Server表中转储SSIS USER变量名称和值
- 18. 更改SQL Server 2008中的列名称
- 19. SqlDataSourceEnumerator不返回SQL Server名称列表
- 20. SQL Server按名称搜索列
- 21. Sql Server 2008有列显示名称吗?
- 22. SQL Server无效的列名称错误
- 23. 从SQL Server获取列名称
- 24. SQL Server Service Broker列名称和类型?
- 25. SQL Server - 使用JSON返回列名称
- 26. 无效列名称的SQL Server
- 27. SQL Server 2008:创建动态列名称
- 28. SQL Server:无效的列名称
- 29. SQL Server变量
- 30. SQL Server 2005 - 基于在主要查询中传递的变量的列名称
除非你读这个先不使用动态SQL: http://www.sommarskog.se/dynamic_sql.html – HLGEM 2010-04-28 16:52:46