【发布时间】:2018-11-07 14:55:50
【问题描述】:
我正在尝试从 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();
}
这样可以吗?
【问题讨论】:
-
从客户端代码执行
sp_executesql没有什么意义,因为客户端代码已经可以参数化任何语句并在必要时执行文本替换。通过将CommandText设置为sql.SQL并将CommandType设置为Text,您将获得(几乎)相同的效果。请注意,即使使用sp_executesql,您也不能参数化IN子句——您只能以文本方式替换它,或使用表值参数。请参阅here,但请务必阅读已接受的答案(这是一个肮脏的黑客)。 -
我想通了,你需要为IN子句中的每个元素生成一个参数:stackoverflow.com/questions/9384446/…
标签: c# sql-server sp-executesql