Sql server 2008 扣动扳机?
我得到了下面这个场景 有四个表格:国家、州、城市、街道Sql server 2008 扣动扳机?,sql-server-2008,triggers,sqlbulkcopy,Sql Server 2008,Triggers,Sqlbulkcopy,我得到了下面这个场景 有四个表格:国家、州、城市、街道 我有一个excel文件,上面有记录,到目前为止可能有2000行 我使用SqlBulkCopy将数据导入临时表,让我们将表命名为import 我在IMPORT表上为insert编写了一个触发器,它获取插入的记录 并拆分国家、州、城市和街道,然后将它们插入到相应的表中 在这个触发器中,我需要做一些条件检查,比如,如果国家名称已经存在,那么返回国家ID,否则插入它并获取新的国家ID 如果Excel文件只有一行,则上述操作有效。 一旦我将原始Exc
我有一个excel文件,上面有记录,到目前为止可能有2000行 我使用SqlBulkCopy将数据导入临时表,让我们将表命名为import 我在IMPORT表上为insert编写了一个触发器,它获取插入的记录 并拆分国家、州、城市和街道,然后将它们插入到相应的表中
在这个触发器中,我需要做一些条件检查,比如,如果国家名称已经存在,那么返回国家ID,否则插入它并获取新的国家ID 如果Excel文件只有一行,则上述操作有效。 一旦我将原始Excel用于导入,我发现触发器中的以下语句失败了“从插入的国家/地区选择”,因为sqlbulkcopy使插入到具有多个记录。
表格结构 国家
- 国家识别号
- 国名
- 州ID
- 国家识别号
- 州名
- 城市标识
- 州ID
- 国家识别号
- 城市名称
- 街道识别号
- 城市标识
- 州ID
- 国家识别号
- 街道名称
- 国名
- 州名
- 城市名称
- 街道名称
提前感谢。我决不会将任何此类处理密集型任务放入用于批量加载的表上的触发器中!而且,永远不要开始将游标之类的循环放入触发器中-触发器必须小、精巧、吝啬-只是快速插入审计表或其他东西-但它应该不要做繁重的工作 你应该做的是:
- 使用
尽可能快地将数据放入该暂存表,而不使用触发器或任何东西SqlBulkLoad
- 然后根据该暂存表,通过拆分列值之类的内容来进行必要的后处理
SqlBulkLoad
所具有的任何好处
要进行这种后处理(比如为给定的
国家确定国家ID
),您不需要游标或任何有害位,只需使用标准,普通的更新表上的语句-这就是您所需要的。我不会将任何此类处理密集型任务放入用于批量加载的表上的触发器中!而且,永远不要开始将游标之类的循环放入触发器中-触发器必须小、精巧、吝啬-只是快速插入审计表或其他东西-但它应该不要做繁重的工作
你应该做的是:
- 使用
SqlBulkLoad
尽可能快地将数据放入该暂存表,而不使用触发器或任何东西
- 然后根据该暂存表,通过拆分列值之类的内容来进行必要的后处理
否则,您将完全失去SqlBulkLoad
所具有的任何好处
要进行这种后处理(比如为给定的国家确定国家ID
),您不需要游标或任何有害位,只需使用标准,在你的表上运行代码<代码>更新>代码>语句。这就是你所需要的。 你的第一个问题是你永远不应该考虑将记录集作为第一选择。在这里,几乎总是错误的选择。你的下一个问题是触发器处理的是整个记录集,而不是一次处理一条记录。根据你的描述,我敢打赌你写它时假设它一次处理一条记录。您需要一个基于集合的流程
您可能需要在触发器中使用类似于此的内容,以便在inserted中插入国家表中尚未包含的所有国家(假设国家Id为整数标识列):
您也可以使用存储的PROC而不是触发器来从分级表插入实际表。
您的第一个问题是,您不应该考虑将记录集循环为第一选择。在这里,几乎总是错误的选择。你的下一个问题是触发器处理的是整个记录集,而不是一次处理一条记录。根据你的描述,我敢打赌你写它时假设它一次处理一条记录。您需要一个基于集合的流程
您可能需要在触发器中使用类似于此的内容,以便在inserted中插入国家表中尚未包含的所有国家(假设国家Id为整数标识列):
您还可以使用存储的proc而不是触发器从暂存表插入到实际表中。很抱歉回复太晚。。那是我要找的。谢谢你的回答和教育。很抱歉回复太晚。。那是我要找的。谢谢你的回答和教育。
Insert country (country_name)
select country_name
from inserted i
where not exists
(select * from country c
where c.country_name = i.country_name)