2011-02-25 3 views
0

현재 테이블은 다음과 같습니다.스키마 변경 : 다른 테이블의 필드를 외부 키로 변환

 
    Stuff 
    ---------- 
    StuffId identity int not null 
    Description nvarchar(4000) null 
    ... 

특별히 사용자 생성 컨텐츠 용으로 따로 설정 한 별도의 테이블에 설명을 저장하려고합니다.

 
    Content 
    ---------- 
    ContentId identity int not null 
    Content nvarchar(max) not null 
    ... 

(이 테이블은 이미 있습니다. 그리고 다른 테이블은 이미 그 안에 엔트리를 참조하고 있습니다.)

그래서 다음과 같이해야합니다 :

  1. 외래 키 제약 조건을 가진 Stuff 테이블에 DescriptionContentId 필드를 만듭니다.
  2. 현재 설명 컨텐츠를 컨텐츠 테이블에 복사하십시오.
  3. 2 단계에서 값을 삽입 할 때 자동으로 생성 된 ContentId 값을 갖도록 각 DescriptionContentId를 설정하십시오.
  4. 설명 열을 삭제하십시오.

1 단계와 4 단계를 수행하는 방법을 알고 있지만 2 단계와 3 단계는 거의 동시에 수행해야하기 때문에 나를 잊어 버리고 있습니다. 이것은 상당히 일반적인 스키마 변경 인 것처럼 보입니다. 가장 좋은 방법은 무엇입니까?

업데이트

나는 Output 키워드 덕분에 좀 더 가까워졌습니다. 그러나 나는 아직 뭔가를 놓치고 있습니다. 여기 내가 뭘하고 싶은거야 :

create table #tmp (StuffId int, ContentId int) 

insert into Content(Content) 
output s.StuffId, inserted.ContentId 
into #tmp(StuffId, ContentId) 
    select Description 
    from Stuff s 
    where Description IS NOT NULL 
create table #tmp (StuffId int, ContentId int) 

insert into Content(Content) 
output s.StuffId, inserted.ContentId 
into #tmp(StuffId, ContentId) 
    select Description 
    from Stuff s 
    where Description IS NOT NULL 

그러나 그것은 콘텐츠 테이블에 삽입 된 필드 중 하나가 아니기 때문에 s.StuffId를 참조 할 수 없습니다. 각 Stuff 항목에 대해 새 Content 항목을 삽입 할 때 Stuff의 ID와 Content의 ID를 어떻게 연관시킬 수 있습니까?

답변

1

당신의 구출 부분이 올 것입니다.

설명과 ID 열을 삽입 된 테이블로 출력하고 다른 테이블을 업데이트하기 위해 해당 데이터를 사용할 수 있습니다.

설명이 고유하지 않은 경우 다음을 수행해야 할 수 있습니다. 콘텐츠 테이블에 stuffID 열의 열을 추가하십시오. 그런 다음 삽입물에서 stuffid 및 content id를 출력하고 고유성을 보장하기 위해 stuffid를 사용하여 테이블을 업데이트하고 컨텐츠 테이블에서 stuffid 열을 삭제합니다.

의 OUTPUT에게

DECLARE @MyTableVar table(
    LastName  nvarchar(20) NOT NULL, 
    FirstName nvarchar(20) NOT NULL, 
    CurrentSales money NOT NULL 
); 

INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales) 
    OUTPUT INSERTED.LastName, 
     INSERTED.FirstName, 
     INSERTED.CurrentSales 
    INTO @MyTableVar 
    SELECT c.LastName, c.FirstName, sp.SalesYTD 
    FROM HumanResources.Employee AS e 
     INNER JOIN Sales.SalesPerson AS sp 
     ON e.EmployeeID = sp.SalesPersonID 
     INNER JOIN Person.Contact AS c 
     ON e.ContactID = c.ContactID 
    WHERE e.EmployeeID LIKE '2%' 
    ORDER BY c.LastName, c.FirstName; 
+0

우수를 사용하는 방법에 대한 온라인 설명서에서 예. 이것이 내가 잃어버린 열쇠 인 것 같습니다. 나는 그것에 대해 연구하고 그것이 효과가 있는지 알려줄 것입니다. – StriplingWarrior

+0

불행히도, 나는 여전히 차단되어 있습니다. 내 업데이트를 참조하십시오. – StriplingWarrior

+0

변환을 수행하려면 콘텐츠 테이블에 일시적으로 stuffid를 추가해야합니다. 위의 3 항을 참조하십시오. – HLGEM

관련 문제