SQL-将一个表拆分为两个并链接

SQL-将一个表拆分为两个并链接,sql,sql-server,database,Sql,Sql Server,Database,我正在使用SQL Server 2014。我查阅了Joel Coehoorn的解决方案,但它对我不起作用 我有一个客户表,我将其重命名为Aac_Client,其中包含客户信息和地址信息作为列。我想将地址移动到一个新表Address,以组织内容,并将其他剩余内容保留在Ac_Client中。我正在努力做到以下几点: 注意地址和客户机之间是一对一的关系。 BEGIN TRANSACTION DECLARE @DataID int; -- Insert Address INSERT

我正在使用SQL Server 2014。我查阅了Joel Coehoorn的解决方案,但它对我不起作用

我有一个客户表,我将其重命名为
Aac_Client
,其中包含客户信息和地址信息作为列。我想将地址移动到一个新表
Address
,以组织内容,并将其他剩余内容保留在
Ac_Client
中。我正在努力做到以下几点:

注意地址和客户机之间是一对一的关系。

BEGIN TRANSACTION
   DECLARE @DataID int;

   -- Insert Address
    INSERT INTO Address ([StreetNumber],[StreetName] ,[StreetAddress2] ,[Unit] ,[City] ,[State] ,[Zip] ,[County])
      SELECT  [StreetNumber], [StreetName], [StreetAddress2], [Unit] ,[City] ,[State] ,[Zip] ,
      NULL AS [County]
      FROM Aac_Client

    -- Get Address Id
   SELECT @DataID = scope_identity();

    -- Insert Client    
    INSERT INTO Ac_Client ( AddressId, Name, Phone, Contact )
        SELECT  @DataID AS AddressId, Name , Phone, Contact FROM Aac_Client

COMMIT
但问题是INSERT立即被携带,我在
SELECT@DataID=scope_identity()中获得了地址的最后一个ID

在临时表中使用第一条insert语句的output子句。客户是否可能有多个地址?或者在同一地址有多个客户端?如果是这样,您可能需要考虑将AcClient ID放在地址表中,而不是客户机表中的AddiSsSID。此外,如果您不担心在同一地址的多个客户端独立地更改地址,则可以考虑第三个表来关联地址和客户端,这样就不必重复地址或客户端来创建多对多关系。 我猜扩展作用域时,标识是一个标量值,意味着只保留1个值,它是作用域中更改的最后一行的标识。在本例中,您需要所有ID,因此需要使用output子句

--Add the following Columns that you can later Drop 

ALTER TABLE [Address] ADD Col_GUID UNIQUEIDENTIFIER;
ALTER TABLE [Aac_Client] ADD Col_GUID UNIQUEIDENTIFIER;
GO

-- Give a Unique value to each row.
UPDATE [Aac_Client] SET Col_GUID = NEWID();

BEGIN TRANSACTION;

   -- Table variable to capture newly generated Identity values
   Declare @NewID TABLE (AddressId INT, Col_GUID UNIQUEIDENTIFIER) 

   -- Insert Address (with output clause to get the Identity values)
INSERT INTO [Address] ([StreetNumber],[StreetName] ,[StreetAddress2] 
                                      ,[Unit] ,[City] ,[State] ,[Zip] ,[County], Col_GUID)
OUTPUT Inserted.AddressId , Inserted.Col_GUID INTO @NewID (AddressId , Col_GUID)
SELECT  [StreetNumber], [StreetName], [StreetAddress2] 
                            ,[Unit] ,[City] ,[State] ,[Zip] , NULL AS [County] , Col_GUID
FROM Aac_Client


    -- Insert Client joining with the Table variable on the guid column to
    -- to get the new Identity values. 

INSERT INTO Ac_Client ( AddressId, Name, Phone, Contact )
SELECT  N.AddressId, a.Name , a.Phone, a.Contact 
FROM Aac_Client a
INNER JOIN @NewID N ON n.Col_GUID = a.Col_GUID

COMMIT TRANSACTION;
最后,您可以删除为此目的添加的列

ALTER TABLE [Address] DROP COLUMN Col_GUID;
ALTER TABLE [Aac_Client] DROP COLUMN Col_GUID;

您的
Address
insert语句假设
Address
表中有一个
ClientID
列,这显然会使事情变得更简单,但事实并非如此,因此答案对OP没有帮助。是的,我知道必须有一个,或者这与他的客户表没有关系。我猜这是假设AddressId是他新地址表上的一个标识列,因为它不可能存在于他当前的客户机表中。我认为是
AddressId
列将链接回客户机表,因为客户机表有AddressId列。是的,但最终要链接回临时表或变量你需要一些东西来维持这种关系。您建议更改他的表并添加一个NewID()。我只是想告诉他,如果表中有身份,就使用表中的身份。我们又在说同样的话。尽管我们希望使用表时不会有太多数据vairable@tika我拒绝了您可能进行的编辑,因为您必须有一种将数据从输出表关联到客户机表的方法。如果您的aaC_client表上没有可以使用的clientid或id,则必须使用M.Ali或类似的方法,至少暂时创建一个。此外,为了获得insert.clientid,实际上必须插入它。之后,始终可以从地址表中删除该列
ALTER TABLE [Address] DROP COLUMN Col_GUID;
ALTER TABLE [Aac_Client] DROP COLUMN Col_GUID;