如何将数组/数据表之类的变量传递给SQL服务器?

有时您需要使用数据表中的许多行来升级数据库,或者您拥有一个充满数据的数组,而不是将所有这些数据放在一个字符串中然后在SQL SERVER中拆分,或者不是在数据表中迭代数据表。代码逐行和更新数据库,还有其他方法吗? 除了SQL SERVER 2005中的传统变量之外还有其他类型的变量吗?

有几种方法可以做到这一点。

如果您只是插入行,那么我将使用其中的信息创建一个DataTable对象,然后使用SqlBulkCopy对象:

SqlBulkCopy copier = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.Default); copier.BatchSize = 500; //# of rows to insert at a time copier.DestinationTableName = "dbo.MyTable"; copier.WriteToServer(myDataTable); 

另一种选择是将数据包装在xml中(但是你想要这样做),并使用sql 2005’xml’数据类型将它发送到你的存储过程(它做你需要做的任何事情)

我同意John的观点, SqlBulkCopy或sqlxml是SQL Server 2005中的最佳选择; 请注意,在SQL Server 2008中,您还有表值参数 ,值得考虑; 特别是当与新的合并连接混合使用时。

请注意,如果您使用SqlBulkCopy ,我强烈建议仅批量插入临时表 – 即仅用于导入的单独表; 然后运行存储过程将数据移动到实时表。 这样您就可以获得正确的日志记录,并且您可以在运行SP时在数据库中拥有一个严格范围的事务(即,您不需要跨越所有网络IO的事务)。

另一点; 如果您正在处理大量数据,您可能不希望加载DataTable (因为这会强制您先缓冲内存中的所有数据); 作为替代方案,也可以编写自己的IDataReader来从流中提取数据(例如文件等); 在这里看到SimpleDataReaderSqlBulkCopy将非常愉快地接受来自IDataReader数据。

John提到使用XML …这就是我将用于您的情况的方法(SQL Server 2005,并制作一个为您处理SQL的sproc)。

这是一个如何开始的示例(这只是一个select语句,但如果需要,可以将其作为更新):

 CREATE PROCEDURE MySproc ( @Accounts XML ) AS SELECT Accounts.AccountID.query('.') FROM @Accounts.nodes('//ID/text()') AS Accounts(AccountID) GO EXEC MySproc '123456'