在Trigger中循环?

sqlbulkcopy sql-server-2008 triggers

我得到以下情况,

有四个表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
  • STATE_NAME

  • City_ID
  • STATE_ID
  • COUNTRY_ID
  • 城市名

  • Street_ID
  • City_ID
  • STATE_ID
  • COUNTRY_ID
  • 街道名称

进口

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

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

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

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

提前致谢。

一般承认的答案

您的第一个问题是,您绝不应该考虑将记录集循环作为第一选择。它几乎总是错误的选择,因为它在这里。你的下一个问题是,触发器不是一次处理整个记录集,而是从你的描述中处理,我敢打赌你写的它假设它一次处理一条记录。您需要一个基于集合的流程。

在你的触发器中你可能需要这样的东西,它会插入所有未插入国家表的国家(这假设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)

您还可以使用存储过程而不是触发器从登台表插入实际表。


热门答案

绝不会将任何此类处理密集型任务放入用于批量加载的表的触发器中!而从来没有开始将像光标之类的东西环插入触发器-触发一定要小,精简的意思是-只是一个快速插入到一个审计表或东西-但它应该做的繁重!

你应该做的是:

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

否则,你完全杀掉了SqlBulkLoad拥有的任何好处。

要做这个后期处理(比如确定给定Country Country_ID ),你不需要游标或任何这些邪恶的东西 - 只需在你的桌子上使用标准的,普通的UPDATE语句 - 这就是你的全部需要。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因