首页 > 解决方案 > 如何将 SQL 列别名指定为 SqlParameter?

问题描述

是否可以将列的别名添加为SqlParameterSQL 命令?如果是这样,它是如何指定的?

作为一个简化的例子,假设我有一个这样构造的 SQL 命令:

SqlCommand GetCommand(string columnName)
{
    string filter = String.Format("SELECT MyColumn1 AS '{0}' FROM MyTable", columnName);

    return new SqlCommand(filter);
}

这个命令对防止 SQL 注入攻击没有任何作用,所以我想遵循标准过程并参数化命令。

我习惯于将 WHERE 子句中的语句转换为使用参数。这些语句看起来与上面类似,例如:

SqlCommand command("SELECT * FROM MyTable WHERE name = '{0}'", name);

当我转换它时,它变成:

SqlCommand command("SELECT * FROM MyTable WHERE name = @name");
command.Parameters.Add(new SqlParameter("name", SqlDbType.NVarChar) { Value = name });

效果很好。此处采用与该方法相同的GetCommand()方法给出:

SqlCommand GetCommand(string columnName)
{
    string filter = "SELECT MyColumn1 AS @columnName FROM MyTable";

    SqlCommand command = new SqlCommand(filter);
    command.Parameters.Add(new SqlParameter("columnName", SqlDbType.NVarChar) 
        { Value = columnName });

    return command;
}

但是,当命令执行时,它会导致:

MyApplication.exe 中出现“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理

附加信息:“@columnName”附近的语法不正确。

我看到在 SO 和网络上有很多关于使用的问题SqlParameter,但似乎没有一个涉及到它们与列别名的使用。

Microsoft 的 SqlParameter 文档中也没有任何指示。由此,我注意到该SqlParameter.Direction属性默认为ParameterDirection.Input; 列别名用于输出,所以我尝试了InputOutputand Output,但它对结果没有影响。

标签: c#sql-server

解决方案


简短的回答:你不能

列别名不可参数化。它们是 SQL 语言中的标识符,而不是值——就像列名本身或表名一样。

“从表 Y 中获取我的列 X,并在结果集中将其命名为 Z。” X、Y 或 Z 都不是可参数化的。

请注意,这不是SqlParameter对 SQL 语言的限制,而是由 Sql Server 实现的。


推荐阅读