修改SQL表以将现有行中的数据插入上一行

时间:2014-10-01 21:47:36

标签: sql sql-server insert cursor

我有一个名为RawData的SQL表,其中包含以下六列(所有类型VARCHAR):

Name StreetAddress State Phone Website Email

我定期将CSV文件中的新数据导入此表格,其中99%的格式正确。对于1%的数据,由于我理解但对此问题不重要的原因,导入的数据会导致前五列(NameStreetAddressState中的所有列,PhoneWebsite)包含格式正确但第六列Email为空的数据。此外,电子邮件会立即导入到此“问题”行下方的行中,但电子邮件会放在Name列中。在电子邮件地址始终插入带有Name前缀的mailto:列中时,可以轻松识别这些情况。

我想要做的是设计查询以从Name获取错误放置的电子邮件地址,删除mailto:前缀,然后将其放入Email列中的Email列上一行。然后,我想在“名称”列中删除带有“mailto:”电子邮件的行。

我做了一些研究,并且相信我需要使用游标从正确行下面的行复制数据并将其插入ID列,但之前从未使用过游标,我我正在努力想出任何东西。任何帮助,将不胜感激。

编辑:为了简洁起见,我省略了该表确实包含标识列{{1}}。

1 个答案:

答案 0 :(得分:2)

在SQL Server中,没有“previous”行的概念。您将需要向表中添加标识列,以便识别这些情况。幸运的是,您可以将数据插入到视图中,因此标识会在加载顺序中自动递增。

获得ID后,您可以使用更新:

update nd
    set nd.email = stuff(ndnext.name, 1, 7, '')
    from newdata nd join
         newdata ndnext
         on nd.id = ndnext.id - 1
    where ndnext.name like 'mailto:%';

一旦您确认这是正确的,您可能想要这样做:

delete nd from nd
    where nd.name like 'mailto:%';