복붙노트

[SQL] 그것은 열하지 삽입을 반환하는 SQL 출력 절의 할 수 있습니까?

SQL

그것은 열하지 삽입을 반환하는 SQL 출력 절의 할 수 있습니까?

내 데이터베이스에 대한 일부 수정했습니다 나는 새 테이블에 기존 데이터를 마이그레이션해야합니다. 이를 위해, I는 원래의 테이블 (연습)로부터 데이터를 취득 테이블 (ReportOptions)을 작성하고, 제 2 중간 테이블 (PracticeReportOption)을 채울 필요가있다.

ReportOption (ReportOptionId int PK, field1, field2...)
Practice (PracticeId int PK, field1, field2...)
PracticeReportOption (PracticeReportOptionId int PK, PracticeId int FK, ReportOptionId int FK, field1, field2...)

나는 ReportOptions에 연습에서 이동하는 데 필요한 모든 데이터를 얻을 수있는 쿼리를했다,하지만 난 중간 테이블을 채우는 데 문제

--Auxiliary tables
DECLARE @ReportOption TABLE (PracticeId int /*This field is not on the actual ReportOption table*/, field1, field2...)
DECLARE @PracticeReportOption TABLE (PracticeId int, ReportOptionId int, field1, field2)

--First I get all the data I need to move
INSERT INTO @ReportOption
SELECT P.practiceId, field1, field2...
  FROM Practice P

--I insert it into the new table, but somehow I need to have the repation PracticeId / ReportOptionId
INSERT INTO ReportOption (field1, field2...)
OUTPUT @ReportOption.PracticeId, --> this is the field I don't know how to get
       inserted.ReportOptionId
  INTO @PracticeReportOption (PracticeId, ReportOptionId)
SELECT field1, field2
  FROM @ReportOption

--This would insert the relationship, If I knew how to get it!
INSERT INTO @PracticeReportOption (PracticeId, ReportOptionId)
SELECT PracticeId, ReportOptionId
  FROM @ReportOption

나는 OUTPUT 절에서 대상 테이블에없는 필드를 참조 할 수 있다면, 그 (내가 할 수없는 생각하지만, 나는 확실히 모른다) 좋은 것입니다. 나의 필요를 수행하는 방법에 어떤 아이디어?

해결법

  1. ==============================

    1.대신 삽입의 MERGE를 사용하여이 작업을 수행 할 수 있습니다 :

    대신 삽입의 MERGE를 사용하여이 작업을 수행 할 수 있습니다 :

    그래서이 교체

    INSERT INTO ReportOption (field1, field2...)
    OUTPUT @ReportOption.PracticeId, --> this is the field I don't know how to get
           inserted.ReportOptionId
      INTO @PracticeReportOption (PracticeId, ReportOptionId)
    SELECT field1, field2
      FROM @ReportOption
    

    MERGE INTO ReportOption USING @ReportOption AS temp ON 1 = 0
    WHEN NOT MATCHED THEN
        INSERT (field1, field2)
        VALUES (temp.Field1, temp.Field2)
        OUTPUT temp.PracticeId, inserted.ReportOptionId, inserted.Field1, inserted.Field2
        INTO @PracticeReportOption (PracticeId, ReportOptionId, Field1, Field2);
    

    당신은 항상 삽입을 수행하지만, 소스 및 대상 테이블 모두에서 필드에 액세스 할 수 있도록 키, 병합 검색 조건에 진실하지 않습니다 술어 (1 = 0)를 사용하는 것입니다.

    여기에 내가 그것을 테스트하는 데 사용되는 전체 코드는 다음과 같습니다

    CREATE TABLE ReportOption (ReportOptionID INT IDENTITY(1, 1), Field1 INT, Field2 INT)
    CREATE TABLE Practice (PracticeID INT IDENTITY(1, 1), Field1 INT, Field2 INT)
    CREATE TABLE PracticeReportOption (PracticeReportOptionID INT IDENTITY(1, 1), PracticeID INT, ReportOptionID INT, Field1 INT, Field2 INT)
    
    INSERT INTO Practice VALUES (1, 1), (2, 2), (3, 3), (4, 4)
    
    
    MERGE INTO ReportOption r USING Practice p ON 1 = 0
    WHEN NOT MATCHED THEN
        INSERT (field1, field2)
        VALUES (p.Field1, p.Field2)
        OUTPUT p.PracticeId, inserted.ReportOptionId, inserted.Field1, inserted.Field2
        INTO PracticeReportOption (PracticeId, ReportOptionId, Field1, Field2);
    
    SELECT  *
    FROM    PracticeReportOption
    
    DROP TABLE ReportOption
    DROP TABLE Practice
    DROP TABLE PracticeReportOption 
    

    더 읽기, 주제에 내가 알고있는 모든 소스는 여기

  2. ==============================

    2.MS SQL Server 2005 또는 이하를 사용 어쩌면 사람이 답변이 유용 할 것이다.

    MS SQL Server 2005 또는 이하를 사용 어쩌면 사람이 답변이 유용 할 것이다.

    MERGE는 SQL 서버 2008 이상에서만 작동합니다. 나머지 나는 당신에게 매핑 테이블의 종류 만들 수있는 기능을 제공합니다 다른 해결 방법을 발견했다.

    여기에 해상도는 SQL 2005과 같이됩니다 방법은 다음과 같습니다

    DECLARE @ReportOption TABLE (ReportOptionID INT IDENTITY(1, 1), Field1 INT, Field2 INT)
    DECLARE @Practice TABLE(PracticeID INT IDENTITY(1, 1), Field1 INT, Field2 INT)
    DECLARE @PracticeReportOption TABLE(PracticeReportOptionID INT IDENTITY(1, 1), PracticeID INT, ReportOptionID INT, Field1 INT, Field2 INT)
    
    INSERT INTO @Practice (Field1, Field2) VALUES (1, 1)
    INSERT INTO @Practice (Field1, Field2) VALUES (2, 2)
    INSERT INTO @Practice (Field1, Field2) VALUES (3, 3)
    INSERT INTO @Practice (Field1, Field2) VALUES (4, 4)
    
    INSERT INTO @ReportOption (field1, field2)
        OUTPUT INSERTED.ReportOptionID, INSERTED.Field1, INSERTED.Field2 INTO @PracticeReportOption (ReportOptionID, Field1, Field2)
        SELECT Field1, Field2 FROM @Practice ORDER BY PracticeID ASC;
    
    
    WITH CTE AS ( SELECT PracticeID, ROW_NUMBER() OVER ( ORDER BY PracticeID ASC ) AS ROW FROM @Practice )
    UPDATE M SET M.PracticeID = S.PracticeID 
        FROM @PracticeReportOption AS M
        JOIN CTE AS S ON S.ROW = M.PracticeReportOptionID
    
        SELECT * FROM @PracticeReportOption
    

    홈페이지 트릭은 우리가 소스 및 대상 테이블에서 주문 데이터를 두 번 매핑 테이블을 작성하는 것입니다. 2005 서버 SQL에 삽입 된 데이터를 사용하여 출력을 병합 : 여기에 대한 자세한 내용은

  3. from https://stackoverflow.com/questions/10949730/is-it-possible-to-for-sql-output-clause-to-return-a-column-not-being-inserted by cc-by-sa and MIT license