2010-11-22 62 views
0

我得到这个下面的情况下,循环触发?

有四张桌子国家,州,城市,街道
有和我的Excel与above..possibly 2000行以现在的记录文件。

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

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

在这个触发器中,我做了一些条件检查,比如,如果COUNTRY名已经存在,则返回COUNTRY_ID,否则插入它并获取新的COUNTRY_ID。

上述工作如果Excel文件只有一行。 一旦我把原来的Excel导入我想出来触发器中的以下声明失败“从插入国选择”因为sqlbulkcopy使INSERTED有多个记录。

表结构

COUNTRY

  • COUNTRY_ID
  • COUNTRY_NAME

STATE

  • STATE_ID
  • COUNTRY_ID
  • STATE_NAME

CITY

  • City_ID
  • STATE_ID
  • COUNTRY_ID
  • CITY_NAME

STREET

  • Street_ID
  • City_ID
  • STATE_ID
  • COUNTRY_ID
  • STREET_NAME

IMPORT

  • COUNTRY_NAME
  • STATE_NAME
  • CITY_NAME
  • STREET_NAME

所以我可以有循环在触发语句,将通过插入的所有记录循环?

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

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

在此先感谢。

回答

2

你的第一个问题是你永远不应该考虑循环记录集作为第一选择。它在这里几乎总是错误的选择。你的下一个问题是,触发器不是一次一个地从你的描述中处理整组记录,我敢打赌,你假设它会一次处理一条记录,所以我写了它。你需要一个基于集合的过程。

有可能你需要在你的触发像这样这将插入所有国家都插入了是不是已经在该国表(假设COUNTRY_ID是一个整数identitiy列):

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

你也可以使用存储的proc而不是触发器从暂存表中插入真正的表。

+0

对不起,这是我期待的答复。感谢您回答和教育我。 – vijay 2010-11-24 09:56:15

1

我会从来没有把任何这样的处理密集型任务放到用于批量加载的表上的触发器!和永远不会永远开始把像游标这样的循环放入触发器 - 触发器必须小,精益和平均 - 只是一个快速INSERT到审计表或其他东西 - 但它应该而不是做沉重!

你应该做的是这样的:

  • 使用SqlBulkLoad以尽快得到您的数据转换为临时表中,没有触发器或任何基于该临时表
  • 然后,做必要的后处理通过分割列值和类似的东西

否则,你完全杀死SqlBulkLoad有任何好处..

为了完成这个后期处理(例如为给定的Country确定Country_ID),您不需要光标或任何这些坏点 - 只需在您的表上使用标准的普通UPDATE语句 - 这就是你需要的一切。