在 SQL 中编写合并语句

Writing a merge statement in SQL

在这个过程中,我将获得 28 个固定宽度的文件并将其合并为一个 table。过去,这是通过 FoxPro 完成的。正如我今天了解到的那样,FoxPro 没有拒绝或有任何问题的副本。我发现我需要编写一个合并语句才能导入 28,并且在我尝试使用导入向导分别导入每个主键时不会被重复的主键错误绊倒。

我使用带有 SQL Server Express 前端的 Management Studio,因此无法创建 SSIS 包。

我将把它分成两个问题,以免让它变得太复杂。首先,我已经使用 Excel.

将固定宽度的文件转换为制表符分隔的文本文件

第一个问题:是否可以构造一个合并语句,将文件(制表符分隔)从 C 盘导入 SQL 服务器?我可以使用导入向导导入每一个,但这很麻烦。我知道如何编写合并语句,但它要求数据已经存在于 SQL 服务器中。下面是一个例子。问题是怎么从外面带进来

 Merge Industry as TARGET
 Using Table1 as SOURCE
 On (TARGET.Primary keys 1-9 = SOURCE.Primary keys 1-9)

不,您不能在 MERGE 语句期间或作为 MERGE 语句的一部分导入数据。 MERGE操作纯粹针对'upsert'情况;使用匹配和不匹配的标准构建组合两个结果集的逻辑。

要将数据输入 SQL 服务器,您可以通过 UI 工作(当您有 28 个文件时,这非常无聊且容易出错),或者您可以使用一些内置的命令,例如 BULK INSERT.

也许您可以 BULK INSERT 一个一个地文件,并在每次导入后合并。

如果您想继续使用 Foxpro 但要删除重复记录,第一个建议是停止使用 导入向导

向导可能使用起来很方便,但它们有自己的一套 'baggage',这可能会有问题。

除了说它们是固定字段长度格式外,您没有说明这 28 个导入文件的格式(CSV、SDF、TXT 等)。不管怎样,您都可以轻松编写 Foxpro 代码来处理所有导入,而无需使用 'Wizard'。

然后在导入所有记录后,您可以使用类似以下内容轻松消除重复项:

SELECT ImportDBF   && Assuming it is used EXCLUSIVELY
DELETE ALL
INDEX ON <primary key> UNIQUE TAG Uniq  && Create an Index on only UNIQUE instances of your Primary key field
RECALL ALL  && Recall only those UNIQUE records
DELETE TAG Uniq  && Eliminate the temporary Index 
PACK  && PACK out the duplicate records

现在您的 Foxpro 数据 table 应该可以使用了。

祝你好运