使用SQL Server存储过程提取尚未提取的行

时间:2017-11-01 19:54:20

标签: sql sql-server stored-procedures database-design

我有一张桌子Customers。我正在尝试设计一种方法,每天从Customers表中提取数据并创建此数据的CSV。我想只选择那些尚未提取的记录。如何跟踪是否已提取?我不能改变Customers表来添加标志。

到目前为止,我计划使用具有此标志的Stage表。所以我正在编写一个存储过程来从Customers表中获取数据,并为每个记录设置标志为0。在从阶段表中提取此数据后使用SSIS创建CSV,并且一旦将记录提取到CSV,就会更新这些记录的flag = 1的登台表。

这个问题的优秀设计是什么?

客户表:

CustomerID | Name | RecordCreated | RecordUpdated

2 个答案:

答案 0 :(得分:0)

使用列tblExportedEmpID创建另一个表CustomerID。将从Customer表中提取的每个客户的客户ID添加到该新表中。要从Customer表中提取尚未提取的客户,您可以使用此查询:

select * from customer where customerid not in(select customerid from tblExportedEmpID)

答案 1 :(得分:0)

您有RecordCreatedRecordUpdated。如果您有这些信息,为什么还要为每个表单独打扰呢?

您需要创建一个表格或等效文件"保存到下次运行"数据区。您的脚本所做的第一件事就是获取当前时间以及该数据区域中存储的内容。然后,让你的语句查询所有内容:

SELECT <list of columns and transformation>
FROM Customers
WHERE recordCreated >= :lastRunTime AND recordCreated < :currentRunTime

(或recordUpdated,如果您需要重新提取,如果客户的名称发生变化)
请注意,您希望exclusive upper-bound<)涵盖存储时间戳的分辨率低于获取时间戳的机制的情况。

最后一步,存储你的跑步开始 - 无论脚本抓到什么&#34;当前时间&#34; - 进入&#34;保存到下一次运行&#34;数据区。