2012-02-01 3 views
1

SQL Server 2008을 사용하여 일부 레코드를 루프하는 일부 SQL을 작성했습니다. 이 루프 내에서 행을 삽입해야하며 해당 행의 ID는 다른 테이블의 기존 레코드 필드에 삽입됩니다. OUTPUT으로이 작업을 수행 할 수있을 것이라고 생각했지만 정확히하고 싶었던 예제를 찾을 수 없었습니다.sql while 루프 내에 마지막 삽입 된 행의 ID를 가져온 다음 OUTPUT을 사용하여 다른 테이블에 삽입 하시겠습니까?

DECLARE @courseTempID INT 
DECLARE @courseID INT 
DECLARE @academicYearID INT 
DECLARE @courseCode VARCHAR(10) 
DECLARE @uio_id INT 
DECLARE @creatorIntranetUserID INT 

WHILE (SELECT count(*) FROM CoursesTemp WHERE dmprocessed = 0) > 0 
BEGIN 
    SELECT TOP 1 @id = courseTempID FROM CoursesTemp WHERE dmprocessed = 0 
    SELECT TOP 1 @academicYearID = academicYearID FROM CoursesTemp WHERE dmprocessed = 0 
    SELECT TOP 1 @courseCode = courseCode FROM CoursesTemp WHERE dmprocessed = 0 
    SELECT TOP 1 @uio_id = uio_id FROM CoursesTemp WHERE dmprocessed = 0 
    SELECT TOP 1 @creatorIntranetUserID = creatorIntranetUserID FROM CoursesTemp WHERE dmprocessed = 0 

    INSERT INTO dbo.Courses VALUES(3,@academicYearID,1,@courseCode,@uio_id,GETDATE(),@creatorIntranetUserID) 

    OUTPUT INSERTED.courseID INTO @courseID 

    UPDATE CoursesTemp SET dmprocessed = 1, courseID = @courseID WHERE courseTempID = @courseTempID 

END 

내가 점점 오전 오류는 " 'INSERTED'근처의 구문이 잘못되었습니다"입니다 :

는 여기에 지금까지 무슨이다.

누구든지 OUTPUT 사용 방법을 알아낼 수 있습니까?

답변

3

에 마지막 라인을 변경할 수 있습니다. "이 변경되어야합니다 SCOPE_IDENTITY()를

DECLARE @courseTempID INT 
DECLARE @courseID INT 
DECLARE @academicYearID INT 
DECLARE @courseCode VARCHAR(10) 
DECLARE @uio_id INT 
DECLARE @creatorIntranetUserID INT 
DECLARE @id INT 

WHILE EXISTS(SELECT 1 FROM CoursesTemp WHERE dmprocessed = 0) 
BEGIN 
    SELECT TOP 1 @id = courseTempID 
     ,@academicYearID = academicYearID 
     ,@courseCode = courseCode 
     ,@uio_id = uio_id 
     ,@creatorIntranetUserID = creatorIntranetUserID 
    FROM CoursesTemp WHERE dmprocessed = 0 

    INSERT INTO dbo.Courses VALUES(3,@academicYearID,1,@courseCode,@uio_id,GETDATE(),@creatorIntranetUserID) 
    UPDATE CoursesTemp SET dmprocessed = 1, courseID = SCOPE_IDENTITY() WHERE courseTempID = @courseTempID 
END 
+0

이 올바른 해결책이 아니라 작은 오류가, 당신이 변수"@id "를 선언해야합니다라는 오류 메시지와 함께 실패 할 것, 사용하는 것이 안전합니다 @courseTempID. " – GarethD

+0

@ GarthD : 맞습니다. 원래 쿼리에서 올바르게 수행되었다고 가정하고 변수 선언에주의를 기울이지 않았습니다. – Tomek

+0

@Tomek 완벽하게 작동합니다. 이 방법으로 SCOPE_IDENTITY()를 사용할 수 있는지 몰랐다. 변수에 할당 된 INSERT 문 끝 부분에 있어야한다고 생각했다. 고마워, 미래의 프로젝트를 알면 정말 유용 할 것이다. – Laura

0

@@ IDENTITY를 사용하여 마지막으로 삽입 한 ID 값을 검색 할 수 있습니다. 또한 OUTPUT INSERTED.courseID INTO @CourseId을 가지고 있지만있는 int 변수가 @CourseId입니다 INSERT INTO dbo.Courses 사이 VALUES(...)http://msdn.microsoft.com/en-us/library/ms187342.aspx

1

OUTPUT 요구 가고, 당신이에 삽입 할 테이블이 될 필요가있다.

수정 나는 당신이하고자하는 것을 다시 읽었습니다. 대신 OUTPUT를 사용하여, 당신은 적용되는 몇 가지 성능 향상

UPDATE CoursesTemp SET dmprocessed = 1, courseId = SCOPE_IDENTITY() 
WHERE courseTempID = @courseTempID 
관련 문제