C#如何调用#x201C;sp#u executesql”;具有自定义参数和sql主体

C#如何调用#x201C;sp#u executesql”;具有自定义参数和sql主体,c#,sql-server,sp-executesql,C#,Sql Server,Sp Executesql,我正试图从C#执行一个动态SQL,我想使用sp_executesql,因为我想在传递给sp_executesql的动态SQL中传递一个字符串列表,用于IN语句中的 问题是我不知道该怎么做 到目前为止,我是这样做的: using (var dbCommand = databaseConnection.CreateCommand()) { dbCommand.CommandType = CommandType.StoredProcedure; dbCommand.CommandTex

我正试图从C#执行一个动态SQL,我想使用
sp_executesql
,因为我想在传递给
sp_executesql
的动态SQL中传递一个字符串列表,用于
IN
语句中的

问题是我不知道该怎么做

到目前为止,我是这样做的:

using (var dbCommand = databaseConnection.CreateCommand())
{
    dbCommand.CommandType = CommandType.StoredProcedure;
    dbCommand.CommandText = "sp_executesql";

    var sqlParam = dbCommand.CreateParameter();
    sqlParam.DbType = DbType.String;
    sqlParam.ParameterName = "stmt";
    sqlParam.Value = sql.SQL;
    dbCommand.Parameters.Add(sqlParam);

    var incidentIdParam = dbCommand.CreateParameter();
    incidentIdParam.ParameterName = "incidentId";
    incidentIdParam.DbType = DbType.Int32;
    incidentIdParam.Value = arguments.filterAttributes.incidentId;
    dbCommand.Parameters.Add(incidentIdParam);

    dbCommand.ExecuteReader();
}

可以这样做吗?

作为一个选项,您可以在客户端格式化SQL并传递到存储过程就绪字符串。例如:

sql.SQL = "UPDATE ORDERS SET STATUS = 1 WHERE ID = %param%";
然后


从客户机代码执行
sp_executesql
没有什么意义,因为客户机代码已经可以参数化任何语句,并在必要时执行文本替换。通过将
CommandText
设置为
sql.sql
CommandType
设置为
Text
,您将获得(几乎)相同的效果。请注意,即使使用
sp_executesql
,也不能在
子句中参数化
——只能以文本方式替换它,或使用表值参数。请参阅,但一定要阅读接受的答案(这是一个肮脏的攻击)。我知道了如何做,您需要为in子句中的每个元素生成一个参数:为什么不简单地使用参数?您的方法易受SQL注入攻击。尽可能避免走捷径。
sqlParam.Value = sql.SQL.Replace("%param%", arguments.filterAttributes.incidentId.ToString());