假设有以下代码:
public void ExecuteSomeSql(string sql, SqlConnection sqlConnection)
{
etc etc
}假设allSql = sql1 + sql2 + sql3。
在性能或其他方面有什么区别吗?
场景1
ExecuteSomeSql(allSql, sqlConnection);和
场景2
ExecuteSomeSql(sql1, sqlConnection);
ExecuteSomeSql(sql2, sqlConnection);
ExecuteSomeSql(sql3, sqlConnection);我不太确定通过相同的连接多次执行SQL时所做的事情。大概没有复杂的握手,因为我们已经有一个积极的联系。
有什么强烈的理由让我更喜欢场景1而不是场景2?
(就上下文而言,我的问题是我是否可以在C#中实现一些业务规则,我更愿意这样做,或者(性能很重要)我是否应该尝试在一个SQL命令中执行所有的内容。)
发布于 2013-03-07 11:24:44
我想说,这在很大程度上取决于你正在进行的手术。如果您要插入1条记录,那么您所做的事情不会有太大的不同(但是您应该使用参数化查询来保证安全性,并允许缓存exec计划)。如果要插入10条记录,可以发送一串sql,其中包含由分号分隔的10条语句,但您将无法使用参数(或者如果需要使用参数,则需要10 x参数,其中x是插入的字段数),所以最好使用参数化查询。如果你有100个插入,你真的应该使用一个参数化的查询。如果您有1000个插入项,则应该使用SqlBulkCopy类。
总之,没有任何理由不使用参数化语句。甚至那些反对使用它们的人“因为sql是动态的”--您当然可以构建一个参数化的SQL字符串,并在循环中填充一个参数集合,就像您可以将字符串连接在一起一样。
如果您正在寻找一种使SQL更具表现性的方法,则需要在示例中发布更多有关SQL内容的信息。如果将单个字符插入单个列一百万次,那么毫无疑问地使用一个参数化查询,在其中写入SQL,添加参数,执行查询,然后(更改参数值并重新执行)再执行999999次,无疑比在每次执行时设置SqlCommandText一百万次,再次将文本发送到服务器上要快。您可能永远也不会让服务器接受一个30+兆字节字符串,该字符串包含百万连接的“插入(A)值(‘a’);”语句,这些语句与原始问题的字符串连接( sql1 + sql2 .+ sql1000000 )非常相似。
为了解决被查询的问题(而不是回答被问到的问题),可以使用参数化查询,构建查询和param集合一次,但是更改参数值需要N次。或者..。如果您的操作是大容量的,请使用为此优化的类(例如,SqlBulkCopy)。
如果您的sql1、2和3都是不同类型的操作,请准备3条语句,并更改并执行它们在客户机中所需的次数。只有在每个SqlCommandText中使用多个语句时,才会使用"INSERT .选择SCOPE_IDENTITY()“之类的方法来检索计算出来的值,比如自动减震器
https://stackoverflow.com/questions/13805032
复制相似问题