我有一个名为RawData
的SQL表,其中包含以下六列(所有类型VARCHAR
):
Name
StreetAddress
State
Phone
Website
Email
我定期将CSV文件中的新数据导入此表格,其中99%的格式正确。对于1%的数据,由于我理解但对此问题不重要的原因,导入的数据会导致前五列(Name
,StreetAddress
,State
中的所有列,Phone
,Website
)包含格式正确但第六列Email
为空的数据。此外,电子邮件会立即导入到此“问题”行下方的行中,但电子邮件会放在Name
列中。在电子邮件地址始终插入带有Name
前缀的mailto:
列中时,可以轻松识别这些情况。
我想要做的是设计查询以从Name
获取错误放置的电子邮件地址,删除mailto:
前缀,然后将其放入Email
列中的Email
列上一行。然后,我想在“名称”列中删除带有“mailto:”电子邮件的行。
我做了一些研究,并且相信我需要使用游标从正确行下面的行复制数据并将其插入ID
列,但之前从未使用过游标,我我正在努力想出任何东西。任何帮助,将不胜感激。
编辑:为了简洁起见,我省略了该表确实包含标识列{{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:%';