在 C# 中使用参数动态 SQL 查询

Dynamic SQL query with parameters in C#

我想构建一个动态查询,其中列名和 table 名称是参数。

下面是我写的代码:

string query = "DECLARE @sqlQuery varchar(max); " +
               " SELECT @sqlQuery = 'select distinct [@columnName] from [" + 
                   Globals.REPORTING_SCHEMA + "].[@tableName]'; " +
               " exec(@sqlQuery);";

List<SqlParameter> parametersList = new List<SqlParameter>();

SqlParameter param = new SqlParameter();
param.ParameterName = "tableName";
param.SqlDbType = System.Data.SqlDbType.VarChar;
param.Value = request.TableName;
parametersList.Add(param);

param = new SqlParameter();
param.ParameterName = "columnName";
param.SqlDbType = System.Data.SqlDbType.VarChar;
param.Value = request.ColumnName;
parametersList.Add(param);

SQLHelpher sqlHelper = new SQLHelpher(networkConnectionString);
SqlDataReader dataReader = sqlHelper.ExecuteReader(query, parametersList);

我创建了两个参数,@columnname@tablename,它们被传递给函数:

public SqlDataReader ExecuteReader(string sql, List<SqlParameter> parametersList = null)
{
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = this._connectionString;
    conn.Open();

    SqlCommand cmd = new SqlCommand();
    cmd.Connection = conn;
    cmd.CommandText = sql;
    cmd.CommandType = CommandType.Text;

    if (parametersList != null)
    {
        foreach (SqlParameter p in parametersList)
        {
            cmd.Parameters.Add(p);
        }
    }

    SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    return reader;
}

这给了我以下错误:

"Invalid object name 'reporting.@tableName"

似乎在执行命令时参数值没有被替换。我在这里错过了什么?

您只需稍微调整一下 SQL 查询字符串,因为在 SQL 看来您的参数是字符串的一部分。

将它改成这样应该可以工作:

string query = "DECLARE @sqlQuery varchar(max); " +
    " SELECT @sqlQuery = 'select distinct [' + @columnName + '] from [" +
         Globals.REPORTING_SCHEMA + "].[' + @tableName + ']'; " +
    " exec(@sqlQuery);";