2016-06-26 11 views
2

私はSQL Server 2014を使用しています。私はthis questionのJoel Coehoornによる解決策を探しましたが、うまくいきませんでした。SQL - 2つのリンクと1つのテーブルを分割

私はAac_Clientに名前を変更し、クライアント情報とアドレス情報の両方を列として持つクライアントのテーブルを持っています。私は住所を新しいテーブルAddressに移して物事を整理し、残りのものはAc_Clientに保ちたいと思います。私は次をしようとしています:

メモアドレスとクライアントの関係は1対1です。

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実行されていると私は、一時テーブルに最初のINSERT文の出力句を使用SELECT @DataID = scope_identity();

答えて

1
--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; 
2
BEGIN TRANSACTION 

    IF OBJECT_ID('tempdb..#InsertedAddresses') IS NOT NULL 
    BEGIN 
     DROP TABLE #InsertedAddresses 
    END 

CREATE TABLE #InsertedAddresses (
    AddressId INT 
    ,ClientId INT 
) 

    DECLARE @DataID int; 

    -- add a unique client identifier 
    -- Insert Address 
    INSERT INTO Address ([StreetNumber],[StreetName] ,[StreetAddress2] ,[Unit] ,[City] ,[State] ,[Zip] ,[County], [ClientId]) 
    OUTPUT INSERTED.AddressId, INSERTED.ClientId (AddressId, ClientId) 
     SELECT [StreetNumber], [StreetName], [StreetAddress2], [Unit] ,[City] ,[State] ,[Zip] , 
     NULL AS [County] 
     FROM Aac_Client 

    -- Insert Client  
    INSERT INTO Ac_Client (AddressId, Name, Phone, Contact, ClientId) 
     SELECT i.AddressId, Name , Phone, Contact, c.ClientId 
      FROM Aac_Client c 
      INNER JON #InsertedAddresses i 
      ON c.ClientId = i.ClientId 

COMMIT 

にアドレスの最後のIDを取得します。また、クライアントが複数のアドレスを持つ可能性もありますか?それとも同じアドレスのクライアントが1人以上いますか?その場合は、AC_Client IDをクライアントテーブルのaddress_idの代わりにアドレステーブルに入れることを検討してください。また、同じアドレスの複数のクライアントの場合に独立してアドレスを変更することを心配していない場合は、アドレスとクライアントを関連付けるために3番目のテーブルを考慮することができ、多対多の関係を作成するためにアドレスやクライアントを繰り返す必要はありません。

拡大すると思いますscope_identityは1つの値しか保持されておらず、スコープ内で最後に変更された行のIDであることを意味するスカラー値です。あなたの場合、すべてのidsが必要なので、output句を使用する必要があります。

+0

あなた 'Address' insert文は明らかに物事がはるかに簡単になりましたでしょう' Address'テーブルの 'ClientID'列が存在すると仮定しますが、これはそうではありませんので、お答えOPを助けないだろう。 –

+0

ええ、私は1つがなければならないことを知っている、またはこれは彼のクライアントテーブルには関係がありません。まあ、現在のクライアントテーブルに存在しない可能性があるため、AddressIdが新しいアドレステーブルのIDENTITYカラムであると仮定していると思います。 – Matt

+0

私はそれがクライアントテーブルにリンクする 'AddressID'カラムだと思いますクライアントテーブルにはAddressID列があります。 –

関連する問題