拆分字符串,将数据复制到多个表中

时间:2013-04-01 23:42:27

标签: sql sql-server sql-server-2008 tsql sql-server-2005

我有以下表格

表A

RID | Name        |Phone       |Email        |CreatedOn
------------------------------------------------------------
1 | John Smith    | 2143556789 |t1@gmail.com |2012-09-01 09:30:00
2 | Jason K Crull | 2347896543 |t2@gmail.com |2012-08-02 10:34:00

表B

CID| FirstName |LastName |Phone      |Email        |CreatedOn          |Title|Address|City|State
---------------------------------------------------------------------------------------------------
11 | John      | Smith   |2143556789 |t1@gmail.com |2012-09-01 09:30:00|NULL|NULL|NULL|NULL
12 | Jason     | K Crull |2347896543 |t2@gmail.com |2012-08-02 10:34:00|NULL|NULL|NULL|NULL

表C

RID | CID |IsAuthor|CreatedOn
-----------------------------------------
1   | 11  | 0      |2012-09-01 09:30:00
2   | 12  | 0      |2012-08-02 10:34:00

对于“表A”中的每一行,需要在“表B”中创建一行,将名称拆分为如图所示的名字和姓氏,并在创建行之后,使用表A中的RID将新行插入表C,CID从表B,IsAuthor位默认为0和表A中的CreatedOn.CID自动递增。任何人都可以帮助我实现这一目标。我是SQL新手。谢谢!

3 个答案:

答案 0 :(得分:1)

不要再考虑“每一行”并将其视为“一套”。在SQL Server中逐行处理任何事情都很少有效,而且很难用这些术语来思考。

--INSERT dbo.TableC(RID, CID, IsAuthor, CreatedOn)
  SELECT a.RID, b.CID, IsAuthor = 0, a.CreatedOn
  FROM dbo.TableA AS a
  INNER JOIN dbo.TableB AS b
  ON a.Name = b.FirstName + ' ' b.LastName;

如果您认为它返回了正确的结果,请取消注释INSERT

答案 1 :(得分:1)

我相信你正在寻找这样的东西(我离开了一些领域,但这应该得到重点)。主要的是substringcharindex函数,用于将名称拆分为名字和姓氏:

insert into tableb (firstname,lastname,phone,email)
select 
  left(name, charindex(' ',name)-1), 
  substring(name, charindex(' ', name)+1, len(name)), 
  phone, email
from tablea ;

insert into tablec
select a.rid, b.cid, 0, a.createdon
from tablea a 
  inner join tableb b on a.name = b.firstname + ' ' + b.lastname
    and a.phone = b.phone and a.email = b.email ;

SQL Fiddle Demo

如果对相同的名称,电子邮件等有疑虑,那么您可能需要考虑使用可怕的游标和scope_identity()。希望你不必走那条路。

答案 2 :(得分:1)

要拆分名称,请使用CharIndex查找空格的位置,然后Substring将该字拆开。

为了跟踪TableA中TableB中的数据来自哪一行,我只是将一个列粘贴到B上以记录这些数据,然后在插入表C时将其删除。 另一种方法是使CID成为C而不是B的标识列,首先填充C,然后在填充时将该数据提供给TableB。

if OBJECT_ID('TableA','U') is not null drop table TableA
create table TableA 
(
    rid int not null identity(1,1) primary key clustered
    , Name nvarchar(64)
    , Phone nvarchar(16)
    , Email nvarchar(256)
    , CreatedOn datetime default (getutcdate())
)
if OBJECT_ID('TableB','U') is not null drop table TableB
create table TableB  
(
    cid int not null identity(1,1) primary key clustered
    , FirstName nvarchar(64)
    , LastName nvarchar(64)
    , Phone nvarchar(16)
    , Email nvarchar(256)
    , CreatedOn datetime default (getutcdate())
    , Title nvarchar(16)
    , [Address] nvarchar(256)
    , City nvarchar(64)
    , [State] nvarchar(64)
)
if OBJECT_ID('TableC','U') is not null drop table TableC
create table TableC 
(
    rid int primary key clustered
    , cid int unique 
    , IsAuthor bit default(0)
    , CreatedOn datetime default (getutcdate())
)

insert TableA (Name, Phone, Email) select 'John Smith', '2143556789', 't1@gmail.com'
insert TableA (Name, Phone, Email) select 'Jason K Crull', '2347896543', 't2@gmail.com'

alter table TableB 
add TempRid int

insert TableB(FirstName, LastName, Phone, Email, TempRid)
select case when CHARINDEX(' ', Name) > 0 then SUBSTRING(Name, 1, CHARINDEX(' ', Name)-1) else Name end
, case when CHARINDEX(' ', Name) > 0 then SUBSTRING(Name, CHARINDEX(' ', Name)+1, LEN(Name)) else '' end
, Phone
, Email
, Rid
from TableA

insert TableC (rid, cid)
select TempRid, cid 
from TableB

alter table TableB
drop column TempRid

select * from TableB
select * from TableC

在此处试试:http://sqlfiddle.com/#!3/aaaed/1

或替代方法(在B之前插入C):http://sqlfiddle.com/#!3/99592/1