SQL Server中如何将声明变量存储的列名列表传入SELECT语句
错误原因
- 你写的
SELECT @ValList FROM Depots语句中,SQL引擎会将@ValList识别为普通字符串变量,直接输出它的字面量值,不会自动把变量内的逗号分隔内容解析为查询的列名语法。 - 额外注意:你当前
@ValList里的列名DepLocation和实际Depots表的列名DepotLocation拼写不一致,即使采用动态SQL写法也会报错,需要先修正#list表中存储的列名内容。
正确实现方案
你需要使用动态SQL来执行拼接后的查询语句,示例代码如下:
DECLARE @ValList varchar(8000); SET @ValList = NULL -- 先确保#list中的ColumnName拼写正确,生成的@ValList为'DepotID, DepotName, DepotLocation' SELECT @ValList = COALESCE(@ValList + ', ','') + ColumnName FROM #list -- 拼接完整SQL语句并执行 DECLARE @SQL nvarchar(max); SET @SQL = N'SELECT ' + @ValList + N' FROM Depots'; EXEC sp_executesql @SQL;
注意事项
- 动态SQL存在SQL注入风险,如果
#list的ColumnName字段内容来源于用户输入,建议使用QUOTENAME()函数包裹列名拼接,做好校验避免注入攻击。 - 需要控制
@ValList的总长度,避免拼接后的SQL语句超出长度限制。
内容的提问来源于stack exchange,提问作者Mikko
相关产品推荐
相关产品推荐

