0

我得到了以下场景,

有四个表 COUNTRY, STATE, CITY, STREET
我有一个包含上述记录的 excel 文件..截至目前可能有 2000 行。

我使用 SqlBulkCopy 将数据导入临时表,让我们将表命名为 IMPORT。

我在 IMPORT 表上编写了一个用于插入的触发器,该触发器获取插入的记录并拆分国家、州、城市、街道,然后将它们插入到相应的表中。

在此触发器中,我必须进行一些条件检查,例如,如果 COUNTRY 名称已经存在,则返回 COUNTRY_ID,否则将其插入并获取新的 COUNTRY_ID。

如果 Excel 文件只有一行,则上述方法有效。一旦我将原始 Excel 用于导入,我发现触发器中的以下语句失败“从 INSERTED 中选择国家”,因为 sqlbulkcopy 使 INSERTED 具有多个记录。

表结构

国家

  • Country_ID
  • 国家的名字

状态

  • State_ID
  • Country_ID
  • 州名

城市

  • City_ID
  • State_ID
  • Country_ID
  • 城市名

街道

  • Street_ID
  • City_ID
  • State_ID
  • Country_ID
  • 街道名称

进口

  • 国家的名字
  • 州名
  • 城市名
  • 街道名称

那么我可以在触发器中使用循环语句来遍历 INSERTED 中的所有记录吗?

或者如何以最好的方式解决这个问题?

注意:由于他们已经在使用它,我无法控制这些表结构及其关系。

提前致谢。

4

2 回答 2

2

您的第一个问题是,您永远不应该考虑将循环记录集作为首选。就像这里一样,这几乎总是错误的选择。您的下一个问题是触发器一次处理整个记录集而不是一个,根据您的描述,我敢打赌您编写它时假设它一次处理一条记录。您需要一个基于集合的流程。

很可能您在触发器中需要这样的东西,它将插入国家表中尚未插入的所有国家(这假设 country_Id 是一个整数标识列):

Insert country (country_name)
select country_name 
from inserted i
where not exists 
  (select * from country c 
   where c.country_name = i.country_name)

您还可以使用存储过程而不是触发器从临时表插入到真实表中。

于 2010-11-22T14:20:54.387 回答
1

永远不会将任何此类处理密集型任务放入用于批量加载的表上的触发器中!并且永远不要开始将诸如游标之类的循环和类似的东西放入触发器中-触发器必须小而精巧-只需快速插入审计表或其他东西-但它不应该繁重的工作!

你应该做的是:

  • 用于SqlBulkLoad尽快将您的数据放入该临时表中,无需触发器或任何东西
  • 然后基于该临时表,通过拆分列值和类似的东西来进行必要的后处理

否则,您将完全扼杀任何SqlBulkLoad具有..

并且要进行此后期处理(例如确定Country_ID给定的Country),您不需要游标或任何那些邪恶的位 - 只需UPDATE在您的表上使用标准的、普通的语句 - 这就是您所需要的。

于 2010-11-22T06:12:38.743 回答