【问题标题】:sqlbulkcopy, i want to overwrite current rows in the databasesqlbulkcopy,我想覆盖数据库中的当前行
【发布时间】:2011-01-31 00:40:00
【问题描述】:

在我的程序中,我正在填充一个数据表,然后将其批量复制到我的数据库中。

但是,如果行中的 3 列匹配,我希望它覆盖数据库中的一行。

例如,如果我有 5 列

会员编号 注册日期 姓名 地址 城市 状态

因此,如果成员编号、注册日期和名称匹配,我想覆盖该行。 使用批量插入的数据。在我的程序中,整个数据库表都没有填充,我认为加载它太大了。

Using bcp As SqlBulkCopy = New SqlBulkCopy(SqlDataSource2.ConnectionString)

    bcp.DestinationTableName = "dbo.dashboardtasks"

    bcp.WriteToServer(table)

如果最好的方法是用我的数据库表创建一个数据表,我将如何比较行,然后覆盖特定 3 列中匹配的表。然后仅使用已更改的行或新行来更新数据库

INSERT INTO [dashboardtasks] ([tour], [taskname], [deptdate], [tasktype], [desc], [duedate], [compdate], [comments], [agent], [compby], [graceperiod], [id])

【问题讨论】:

  • 如何找到匹配项?是否有 ID 字段或自然键?因为否则这是没有意义的。如果你有一个 ID 字段,它不会总是覆盖吗?如果没有 ID 或键,那么外部文件中的多行不能匹配并覆盖多个现有行吗?
  • 有一个主键,但在我生成的数据表中没有
  • 我的主键是自动递增的,我认为这就是它允许它重复的原因

标签: sql vb.net sql-server-2005


【解决方案1】:

At Mitch 指出批量复制函数(SqlBulkCopybcpBULK INSERT)只处理插入,不处理更新。

解决问题的正常方法是分两个(或更多)步骤执行批量加载 - 首先使用批量插入将数据加载到临时表中,然后使用查询在主表中插入/更新记录基于临时表中数据的表,例如:

INSERT INTO MyTable
(Column1, Column2, [etc...])
SELECT Column1, Column2, [etc...] 
FROM Test_Staging
WHERE [Some condition]

请参阅SQL SERVER – Insert Data From One Table to Another Table ,了解有关如何从另一个表插入一个表的信息 - 也可以在 UPDATE 中进行连接,但我正在努力寻找这方面的好资源。

【讨论】:

  • hmmm 这发生在 sql server 或 vb.net 中吗?因为也许如果它可以在 sql server 中工作会更好
  • @Mitch 我正在写这篇文章,因为你添加了关于临时表的评论 - 没有意识到你已经编辑了你的问题。
  • 如果您能帮助我实现这一点,我们将不胜感激,或者如果您知道我在哪里可以找到示例
  • 很好,非常感谢,但我并不担心插入语句我更想像,我的 asp.net 程序执行批量复制到 dbo.staging(例如),那么我将如何存储程序运行。是否可以批量复制到存储过程中,然后立即执行覆盖真实表的任务
  • @MyHeadHurts 我不确定我是否遵循 - 我认为您可能会混淆概念。无法将存储过程中的记录大容量复制(存储过程是存储的 SQL / 代码,而不是存储的数据)。您可以使用 BULK INSERT 语句在存储过程中执行大容量复制 - 这是您的意思吗?)
【解决方案2】:

SqlBulkCopy 只进行批量插入(这只是它速度快的原因之一)。

您需要使用不同的方法进行批量更新:

  • 使用临时表。使用 SqlBulkCopy 将数据加载到临时表中,然后使用存储过程执行合并。

  • 使用 SSIS。

  • 在 SQL Server 2008 中有用于执行此操作的 MERGE 语句。

【讨论】:

  • 是否可以使用存储过程?
  • 使用 bulkinsert 将所有新行放入表中,使用存储过程,然后覆盖与我想要的 3 列匹配的行
  • @MyHeadHurts:是的。这就是我在上面第一个替代方案中的意思。
  • 好吧,这让我感觉好多了,因为我已经编写了程序,但我的问题是这样的存储过程看起来像我在 sql 中相当新
猜你喜欢
  • 2016-11-28
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多