我想找到一种方法来处理对 sql 数据库的多次更新(一次数据库往返)。我在 SQL Server 2008 中阅读了表值参数 http://www.codeproject.com/KB/database/TableValueParameters.aspx这看起来真的很有用。但似乎我需要同时创建一个存储过程和一个表类型才能使用它。真的吗?也许是出于安全考虑?我想像这样简单地运行一个文本查询:
var sql = "INSERT INTO Note (UserId, note) SELECT * FROM @myDataTable";
var myDataTable = ... some System.Data.DataTable ...
var cmd = new System.Data.SqlClient.SqlCommand(sql, conn);
var param = cmd.Parameters.Add("@myDataTable", System.Data.SqlDbType.Structured);
param.Value=myDataTable;
cmd.ExecuteNonQuery();
所以
A) 我是否必须同时创建存储过程和表类型才能使用 TVP?和
B) 建议使用哪种替代方法向 SQL Server 发送多个更新(和插入)?
最佳答案
是的,您需要创建类型。
备选方案是发送一个大字符串 sql 批处理或将 XML 传递给存储过程。
大 sql 字符串批处理的缺点是它可能会破坏 sql proc 缓存并可能导致 sql 重新编译 - 特别是如果批处理是唯一的,因为输入数据是该大字符串的一部分。根据定义,每个批处理都是独一无二的。
XML 是 TVP 之前的主要替代方案。 XML 的一个缺点是,至少在一段时间内,sql azure 不支持它(这可能会改变?),因此它限制了您的选择。
TVP 似乎是执行此操作的方法。我们的项目刚刚转换为使用 TVP。
希望对您有所帮助。
关于c# - 在 SQL Server 2008 中处理来自 c# 的多个数据库更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7545998/