我有一个C#控制台程序
从Input
表(Keyid varchar(4), Address varchar(100), Name varchar(100)
)中选择10000条记录。
对于来自Input
表的每条记录,它会调用一个返回数据的API(如果有人在该地址中工作,状态就可以,否则也不行,也会返回地址类型 - 感兴趣的地方或住宅,商业等)需要保存在一个主表和一个详细信息表中。
Main
表:
1001|JOE STILTON| 2 MAIN ST, SALEM,PA| OK|4/15/2014
Detail
表:
1001|PHARMACY
1001|COMMERCIAL
即乔在药店工作,这也是一个商业建筑。
现在,我打电话给API。那我叫一个方法,
private static void insertTable(string keyid, DateTime updDate, string name, string address,string status)
{
Int32 rowsAffected = 0;
string connectionString = GetConnectionString();
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
SqlCommand cmd = new SqlCommand("google.usp_InsertCompanyAddrComponents", connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 90;
cmd.Parameters.Add("@keyid", SqlDbType.VarChar);
cmd.Parameters["@keyid"].Value = keyid;
cmd.Parameters.Add( new SqlParameter("@dateverified", updDate));
cmd.Parameters.Add("@name", SqlDbType.VarChar);
cmd.Parameters["@name"].Value = name;
cmd.Parameters.Add("@address", SqlDbType.VarChar);
cmd.Parameters["@address"].Value = address;
cmd.Parameters.Add( new SqlParameter("@status", status));
try
{
rowsAffected = cmd.ExecuteNonQuery();
}
catch (Exception ep)
{
Console.WriteLine(ep.Message);
}
connection.Close();
}
然后,我调用另一个插入详细信息表的类似方法。
由于我必须一次为10,000条记录执行此操作,因此有很多I / O.如何更改批量插入?一次全部插入10000个?
由于 [R
答案 0 :(得分:0)
您还可以查看SQL Server中的表类型。您可以在存储过程中传递两种表类型,并在那里直接执行所需的操作。
这是我的样本存储过程
CREATE PROCEDURE [dbo].[usp_AssociateTags]
@Tags AS UDT_Tag READONLY
AS
SET XACT_ABORT ON
BEGIN TRAN
--Insert into Tag Master
INSERT INTO dbo.TagMaster
(
Name
,IsActive
)
VALUES ( '', -- Name - varchar(50)
1 -- IsActive - bit
)
DECLARE @TagId AS INT
SET @TagId=SCOPE_IDENTITY()
INSERT INTO dbo.TagCollection
( TagNumber, TagId )
SELECT TagNumber, @TagId FROM @Tags t
WHERE NOT EXISTS(SELECT * FROM dbo.TagCollection WHERE TagNumber = t.TagNumber)
COMMIT TRAN
SET XACT_ABORT OFF
测试此存储过程的脚本
--DECLARE @hello as UDT_Tag
--INSERT INTO @hello VALUES('vaibhav')
--INSERT INTO @hello VALUES('Shantanu')
--INSERT INTO @hello VALUES('Sam')
--INSERT INTO @hello VALUES('Aakash')
--EXEC usp_AssociateTags @hello
--SELECT * FROM dbo.TagCollection
使用此程序的C#代码
SqlParameter Tags = new SqlParameter { ParameterName = "@Tags"
, Value = entity.Tags.ToDataTable()
, Direction = ParameterDirection.Input
, SqlDbType = SqlDbType.Structured, TypeName="UDT_Tag" };
SqlHelper.ExecuteNonQuery(tran, CommandType.StoredProcedure
, "usp_AssociateTags", Tags);