SQL Server 2008 表值参数
使用 SQL Server 2008 表值参数插入多条记录 (VS 2008)。
引言
过去两周,我一直在开发批量数据操作。甚至在此之前,我一直想知道“将值数组传递到 SQL Server 存储过程的最佳方法是什么?” 我找到的一个选项是 OpenXML,我曾在 这里 博客过。
最近我正在尝试使用 Visual Studio 2008 和 SQL Server 2008。 昨晚,我发现 SQL Server 现在支持表值参数,允许我们将数据表作为参数传递给存储过程。 它仍然使用相同的 ADO.NET API。
工作原理
现在我将展示它是如何工作的。为此,我使用了与我在 上一篇帖子 (读取文件夹内容并保存其信息) 中使用的相同场景。 这里,我使用了 SQL Server 2008 November CTP 和 Visual C# 2008 Express edition。
首先,创建下面的表
CREATE TABLE FileDetails(
FileName varchar(50) PRIMARY KEY,
CreatedDate varchar(50) ,
Size decimal(18, 0) )
然后,我们应该在数据库中声明一个新的 table
用户定义类型
create type FileDetailsType as table
(
FileName varchar(50),
CreatedDate varchar(50),
Size decimal(18,0)
)
然后,创建一个存储过程,该过程获取上述类型的参数,并在单个命令中插入多行。
create procedure InsertFileDetails
(
@FileDetails FileDetailsType readonly
)
as
insert into
FileDetails (FileName, CreatedDate, Size)
select FileName, CreatedDate, Size
from
@FileDetails;
要执行此过程,我们可以创建一个数据表并将行添加到其中。 然后将此数据表作为参数传递给数据库。
private static void SaveFileDetail(List<FileInfo> info)
{
Console.WriteLine("**********updating with tablevalued parameters****");
DataTable dt = preparedatatable();
foreach (FileInfo file in info)
{
DataRow dr = dt.NewRow();
dr[0] = file.Name;
dr[1] = file.CreationTime.ToShortDateString();
dr[2] = (decimal)file.Length;
dt.Rows.Add(dr);
}
using(SqlConnection conn = new SqlConnection("your connection string"))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "dbo.InsertFileDetails";
SqlParameter param = cmd.Parameters.AddWithValue("@FileDetails", dt);
conn.Open();
cmd.ExecuteNonQuery();
Console.WriteLine("Completed Updating the database");
}
现在这很酷,不是吗?