我正在创建一个应用程序,该应用程序从具有来自亚马逊市场的销售数据的文本文件中获取数据。市场中具有与主数据库中的数据相比具有不同名称的项目。应用程序接受文本文件作为输入,它需要检查该项目是否存在于我们的数据库中。如果不存在,我应该抛出一个选项,将项目保存到主表或子项目表,并将其映射到主项目。我的问题是,如果文本文件有100多个项目,我每次都应该检查数据库是否存在数据。是否有更好的方法可以使我们最大限度地减少数据库命中。
我有两个选项,我之前用过
点击数据库并检查表格中是否存在。
在DataTable中填写数据并使用DataTable.Select检查它是否存在。
有人可以告诉我最好的方法吗?我必须检查两个表(master
表,subItem
表),可能一次检查一个。感谢。
更新
@Downvoters添加评论。
我不是问你是什么方法来检查数据库中是否存在一个项目。我只是想知道这样做的最佳方式。如果文件有1000个项目,我应该打1000次数据库吗?那是我的问题。
我使用的当前查询:
if exists (select * from [table] where itemname= [itemname] )
select 'True'
else
select 'False'
return
答案 0 :(得分:1)
将其作为100个项目批量添加到数据库中。可能存储过程可能会有所帮助,因为必须触发重复查询。如果数据不经常更改,您可以考虑缓存。我假设你将从你的.net
应用程序拨打服务电话,所以要从后端批量提取xml
。请考虑根据文件大小增加批量大小。
如果您的整个应用程序都是本地应用程序,则批量大小可能非常高,因为没有netowrk oberhead,仍然不会对db进行100次调用。
答案 1 :(得分:1)
试试这个
SELECT EXISTS(SELECT * FROM table1 WHERE itemname= [itemname])
SELECT EXISTS(SELECT 1 FROM table1 WHERE itemname= [itemname])
答案 2 :(得分:1)
(来自Chat)
我会创建一个存储过程,其中包含您要检查的所有项目的table valued parameter。然后,您可以使用连接(此处有两个选项)*来返回项目的结果集以及每个项目是否存在。您可以使用TVP's from ADO like this。
它肯定会处理你帖子中提到的100到1000行范围。说实话,我没有在1M +范围内使用它。
在较新版本的SQL Server中,我更喜欢TVP而不是使用xml
输入参数,因为将.xml打包到.Net代码然后再次在SPROC
中解压缩真的非常麻烦。
(*)重新加入:使用结果集,您可以将内部加入TVP到您的项目/产品表,如果行不存在则检入.Net,或者您可以执行左外连接TVP作为左表,例如ISNULL()
将项目丢失为0 /'false'等。