在SQL Server 2008中处理来自c#的多个数据库更新

在SQL Server 2008中处理来自c#的多个数据库更新,c#,.net,sql-server,sql-server-2008,table-valued-parameters,C#,.net,Sql Server,Sql Server 2008,Table Valued Parameters,我喜欢找到一种方法来处理对一个sql db的多个更新(一个db往返)。我在SQLServer2008中读到了表值参数,这似乎非常有用。但似乎我需要创建一个存储过程和一个表类型来使用它。这是真的吗?也许是因为安全原因?我想运行一个简单的文本查询,如下所示: var sql = "INSERT INTO Note (UserId, note) SELECT * FROM @myDataTable"; var myDataTable = ... some System.Data.DataTable .

我喜欢找到一种方法来处理对一个sql db的多个更新(一个db往返)。我在SQLServer2008中读到了表值参数,这似乎非常有用。但似乎我需要创建一个存储过程和一个表类型来使用它。这是真的吗?也许是因为安全原因?我想运行一个简单的文本查询,如下所示:

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重新编译—特别是如果批处理是唯一的,因为输入数据是该大型字符串的一部分。根据定义,每个批次都是唯一的

在TVPs之前,XML是主要的替代方案。XML的一个缺点是,至少在一段时间内,SQLAzure不支持XML(这可能会改变?),因此它限制了您的选择

TVPs似乎是实现这一点的方法。我们的项目刚刚转换为使用TVPs


希望能有帮助。

A)是的。B) 备选方案:XML、[n]varchar(大小)字符串+解析。我的选择是TVP。好的,也谢谢你:)在什么情况下,这不值得避免几次去db?杰夫-我想知道它要花多少钱(另一个问题?)。就目前而言,这是一种预感,更重要的是,这似乎是P&P普遍认同的做法“往返会显著影响绩效。它们受到网络延迟和下游服务器延迟的影响。许多数据驱动的网站对每个用户请求都大量访问数据库。虽然连接池有帮助,但增加的网络流量和数据库服务器上的处理负载可能会对性能产生不利影响。尽量减少往返。“好的,非常感谢。这就是我喜欢的原因。在我提问后1小时内,真实世界的体验就能回答。我制作了我的表格类型和存储过程,现在多个更新是轻而易举的事。