创建批处理的sql语句

时间:2009-07-06 14:50:46

标签: .net sql sql-server-2005 batch-file

我有一份小作业,它接收电子邮件/邮政编码的文本文件,并将它们插入到sql server 2005表中。它读取源文件的每一行,检查以确保它解析为有效的电子邮件地址/邮政编码,创建一个sql insert命令,将其添加到字符串构建器并最终执行它。我想做一次执行而不是单独的sql调用,因为可能有几千个插入。

这有效,但我想知道这是不是一个坏方法。这里最好的做法是什么?

Dim SqlString As String = "insert into [CollectedEmail] values('{0}','{1}');"

Do Until sourceFile.Peek = -1
        line = sourceFile.ReadLine
        If line.Length > 0 Then

            Dim emailAddress As String = Trim(line.Substring(0, EmailLength))
            Dim zipcode As String = Trim(line.Substring(EmailLength + 2, ZipCodeLength))

            If CVal.validEmail(emailAddress) AndAlso CVal.validZip(zipcode) Then
                SQL.AppendLine(String.Format(SqlString, emailAddress, zipcode))
            ElseIf CVal.validEmail(emailAddress) Then
               SQL.AppendLine(String.Format(SqlString, emailAddress, ""))
            Else
                badAddresses.WriteLine(emailAddress)
            End If
        End If

    Loop
 InsertToDatabase(SQL.ToString)

谢谢

3 个答案:

答案 0 :(得分:1)

对于批量插入,请查看.NET 2.0以上版本,SqlBulkCopy类(在System.Data.SqlClient命名空间中)

Marc Gravell在SO上发布了一个使用它的示例:Copy from one database table to another C#

更新以回复评论:您可以将已清理的数据读入DataTable,并将其与SqlBulkCopy一起使用,类似于此example。< / p>

答案 1 :(得分:0)

如果您有sql server 2008,那么您可以使用表值参数,请参阅此处获取更多信息Table-Valued Parameters in SQL Server 2008和示例代码。否则请批量插入

答案 2 :(得分:0)

您还可以将电子邮件捆绑到XML参数中,并拥有一些能够处理它的存储过程。

CREATE PROCEDURE [dbo].[saveEmails]
(   
    @emails xml
)
AS
BEGIN
SET NOCOUNT ON;


insert into collectedemail
(address
,zipcode)
select
x.value('address[1]', 'nvarchar(255)')
,x.value('zipcode[1]', 'nvarchar(10)')  
from @emails.nodes('/items/item') emails(x)

END
GO

您可以保留一个计数器,用于存储排队的记录数,然后在您指定的批量大小后执行。