在SQL中编写合并语句

时间:2018-02-15 21:49:49

标签: sql-server ssms sql-merge

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

我将Management Studio与SQL Server Express前端一起使用,因此无法创建SSIS包。

我打算将其分解为两个问题,以免使其过于复杂。首先,我已经使用Excel将固定宽度文件转换为制表符分隔的文本文件。

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

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

2 个答案:

答案 0 :(得分:2)

不,您无法在MERGE语句期间或作为MERGE语句的一部分导入数据。 BULK INSERT操作仅限于“{1}}操作”。情况;构建逻辑,将两个结果集与匹配和不匹配的标准相结合。

要将数据导入SQL Server,您可以通过UI工作(当您有28个文件时,这非常无聊并且容易出错),或者您可以使用某些内置命令,例如BULK INSERT。< / p>

也许您可以逐个setState文件,并在每次导入后合并。

答案 1 :(得分:1)

如果您想继续使用Foxpro但删除重复记录,则第一条建议是使用导入向导退出。

奇才可能很方便使用,但它们带有自己的“行李”套装,这可能会有问题。

除了说它们是固定字段长度格式之外,您没有指明28个导入文件所在的格式(CSV,SDF,TXT等)。无论您是否可以轻松编写Foxpro代码来处理所有导入而无需使用“向导”。

然后,一旦导入了所有记录,您就可以轻松地删除重复项,如下所示:

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数据表已准备好了。

祝你好运