문제

저는 아직 T-SQL과 SQL 2005를 처음 접했습니다.데이터베이스1의 테이블에서 데이터베이스2의 동일한 테이블(필요한 열만 누락됨)로 정수 열을 가져와야 합니다.둘 다 SQL 2005 데이터베이스입니다.Server Management Studio에서 내장된 가져오기 명령을 시도했지만 전체 테이블을 복사해야 합니다.이로 인해 제약 조건과 '읽기 전용' 열(sql2005에서 '읽기 전용'이 의미하는 것)로 인해 오류가 발생합니다.단일 열을 가져와 테이블에 복사하고 싶습니다.

이를 수행하는 간단한 방법이 있어야 합니다.다음과 같은 것 :

INSERT INTO database1.myTable columnINeed
SELECT columnINeed from database2.myTable
도움이 되었습니까?

해결책

삽입은 테이블 끝에 새 행을 삽입하려고 시도하므로 수행되지 않습니다.당신이하려는 것은 기존 행의 끝에 열을 추가하는 것 같습니다.

구문이 정확히 맞는지는 잘 모르겠지만, 내가 이해했다면 이것이 원하는 작업을 수행할 것입니다.

  1. Database2에 Null을 허용하는 열을 만듭니다.

  2. 업데이트를 수행합니다.

    DataBase2.dbo.tablename set database2.dbo.tablename.tablename.colname.colname = database1.dbo.tablename.colname from database2.dbo.tablename database1.dbo.tablename의 database2.dbo.tablename.tablename = database1.dbo.tablename. 키 콜

다른 팁

두 데이터베이스가 모두 동일한 서버에 있는 한 이와 유사한 간단한 방법이 있습니다.완전히 자격을 갖춘 이름은 dbname.owner.table입니다 - 일반적으로 소유자는 DBO이며 ".dbo"에 대한 바로 가기가 있습니다. "..", 그래서 ...

INSERT INTO Datbase1..MyTable
    (ColumnList)
SELECT FieldsIWant
  FROM Database2..MyTable

열이 없으면 먼저 열을 만듭니다.

ALTER TABLE database2..targetTable
ADD targetColumn int null -- or whatever column definition is needed

SQL Server 2005를 사용하고 있으므로 새로운 기능을 사용할 수 있습니다. 병합 성명.그만큼 병합 문은 하나의 문으로 모든 상황을 처리할 수 있다는 장점이 있습니다. 소스에서 누락된 행(삽입 가능), 대상에서 누락된 행(삭제 가능), 일치하는 행(업데이트 가능) 등 모든 것이 단일 트랜잭션에서 원자적으로 수행됩니다.예:

MERGE database2..targetTable AS t
USING (SELECT sourceColumn FROM sourceDatabase1..sourceTable) as s
ON t.PrimaryKeyCol = s.PrimaryKeyCol -- or whatever the match should be bassed on
WHEN MATCHED THEN 
    UPDATE SET t.targetColumn = s.sourceColumn
WHEN NOT MATCHED THEN
    INSERT (targetColumn, [other columns ...]) VALUES (s.sourceColumn, [other values ..])

MERGE 문은 귀하와 같은 사례를 해결하기 위해 도입되었으며 이를 사용하는 것이 좋습니다. 기본적으로 복잡성을 추가하지 않고 하나의 문에서 MERGE가 수행하는 것과 동일한 작업을 수행하는 여러 SQL 배치 문을 사용하는 솔루션보다 훨씬 강력합니다.

커서를 사용할 수도 있습니다.첫 번째 테이블의 모든 레코드를 반복하고 두 번째 테이블을 새 행으로 채우려는 경우 다음과 같은 방법을 사용할 수 있습니다.

DECLARE @FirstField nvarchar(100)

DECLARE ACursor CURSOR FOR
SELECT FirstField FROM FirstTable 

OPEN ACursor
FETCH NEXT FROM ACursor INTO @FirstField
WHILE @@FETCH_STATUS = 0
BEGIN

   INSERT INTO SecondTable ( SecondField ) VALUES ( @FirstField )

   FETCH NEXT FROM ACursor INTO @FirstField

END

CLOSE ACursor   
DEALLOCATE ACursor

MERGE는 SQL 2005가 아닌 SQL 2008에서만 사용할 수 있습니다.

Test2.dbo.MyTable(MyValue)에 삽입하고 Test1.dbo.MyTable에서 MyValue를 선택합니다.

이것은 많은 것을 가정하고 있습니다.먼저 대상 데이터베이스가 비어 있습니다.둘째, 다른 열은 null을 허용합니다.대신 업데이트가 필요할 수 있습니다.그러기 위해서는 공통 키가 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top