2009-06-25 3 views
0

이 오류가 발생합니다. 내가 뭘하고 있는지 하나의 테이블과 하나의 DB에서 데이터를 가져 와서 다른 DB와 테이블에 넣으려고합니다. 테이블은 정확히 동일하지 않습니다. FETCH 커서를 사용하고 있으므로 db1 테이블에서 첫 번째 행을 가져온 다음 각 열 값을 선언 된 변수에 배치합니다. 그런 다음 INSERT 문을 db2 테이블로 실행하고 다음 값을 가져옵니다. 모두 정상적으로 작동하기 때문에 정상적으로 작동하는 것 같지만 결국이 오류가 발생합니다.'table'키워드 근처에 잘못된 구문이 있습니다.

'table'키워드 근처에 구문이 잘못되었습니다.

전체 트랜잭션 문은 CATCH 블록에서 오류 처리식이있는 TRY/CATCH에 있습니다. 그 외에도 나는이 원인을 알지 못합니다. 도와주세요.

여기 어느 하나 개의 테이블을 선택하거나 다른 내로 삽입하는

BEGIN 

    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    BEGIN TRY 
    BEGIN TRANSACTION 

    --TURN OFF ITENDITY COLUMNS 
    SET IDENTITY_INSERT [DB].[dbo].[TEST] ON 

    --TURN OFF ALL CONSTRAINTS 
    ALTER TABLE [DB].[dbo].[TEST] NOCHECK CONSTRAINT ALL 

    -- Insert statements for procedure here 
    DECLARE @ID int, 
      @DT datetime, 
      @PID varchar(10), 
      @AREA varchar(20) 


    DECLARE FETCH_TEST CURSOR FOR 

    SELECT [ID] 
     ,[Date] 
     ,[PID] 
     ,[Area] 

    FROM [OLDDB].[dbo].[TEST] as db1 

    OPEN FETCH_TEST; 

    FETCH NEXT FROM FETCH_TEST INTO @ID, 
      @DT, 
      @PID, 
      @AREA 


    WHILE @@FETCH_STATUS = 0 
     BEGIN 

      --INSTER VALUES INTO THE TABLE 
      INSERT INTO [DB].[dbo].[TEST] 
         ([ID] 
         ,[DT] 
         ,[PID] 
         ,[AREA]) 
        VALUES 
        (@ID, 
        @DT, 
        @PID, 
        @AREA) 


      FETCH NEXT FROM FETCH_TEST INTO 
      @ID, 
      @DT, 
      @PID, 
      @AREA, 


    END; 

    CLOSE FETCH_TEST; 
    DEALLOCATE FETCH_TEST; 

    -- If we reach here, success! 
    COMMIT 

    END TRY 
    BEGIN CATCH 
    -- Whoops, there was an error 
    IF @@TRANCOUNT > 0 
     ROLLBACK 

    -- Raise an error with the details of the exception 
    DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int 
    SELECT @ErrMsg = ERROR_MESSAGE(), 
      @ErrSeverity = ERROR_SEVERITY() 

    RAISERROR(@ErrMsg, @ErrSeverity, 1) 
    END CATCH 

    --TURN OFF ITENDITY COLUMNS 
    SET IDENTITY_INSERT [DB].[dbo].[TEST] OFF 

    --TURN ON ALL CONSTRAINTS 
    ALTER TABLE [DB].[dbo].[TEST] CHECK CONSTRAINT ALL 

END 
+2

유효하지 않은 구문으로 코드를 게시하십시오. –

+2

코드가 없다는 것이 문제입니다 (SP가없고 DDL이 없음). 당신이 그것을 가지고 있었다면, 당신은 그것을 게시했을 것이고, 그래서 당신은 그것을 가지고 있지 않을 것입니다. –

+0

문제가있는 코드를 게시해야합니다. – Kev

답변

0

키워드 table 유용하지 않는 코드이다. 당신이 그것을 쓴 곳이라면 어디에도 속하지 않습니다.

6

우선은 @TRAIN_ID는 스칼라 변수를 선언해야합니다 코드

에 선언되지 않습니다이다 "@TRAIN_ID".

초는 커서가 필요 없다는 것입니다. 대신 SET 기반 작업에서 잘못된 점이 있습니까? 훨씬 더 잘 수행 할 것입니다 !! 이

INSERT INTO [DB].[dbo].[TEST] 
         ([ID] 
         ,[DT] 
         ,[PID] 
         ,[AREA]) 

SELECT [ID] 
     ,[Date] 
     ,[PID] 
     ,[Area] 
FROM [OLDDB].[dbo].[TEST] as db1 

으로 커서 부분을 교체 당신은 또한

FETCH NEXT FROM FETCH_TEST INTO 
      @ID, 
      @DT, 
      @PID, 
      @AREA, 

FETCH NEXT FROM FETCH_TEST INTO 
      @ID, 
      @DT, 
      @PID, 
      @AREA 

해야 여기에 추가 쉼표를하지만 같은 당신이

에 대한 커서를 필요가 없습니다 말했다
+0

위의 @TRAIN_ID를 사용하여 코드를 편집했습니다. 그것은 여전히 ​​오류를 제공합니다. 둘째, 작동하지만 각 행마다 일부 논리를 수행해야하지만 먼저 행을 가져 와서 먼저 삽입해야 제대로 작동하는지 확인할 수 있습니다. 그러나 나는 아직도 오류를 접수하고 있습니다. –

+0

Dan을 사용하면 로직을 세트 기반 솔루션에도 쉽게 적용 할 수 있습니다. 커서는 성능을 극단적으로 악화시키기 때문에 삽입물에 거의 사용하지 않아야합니다. – HLGEM

4

그리고 그런데 커서를 사용할 필요가 없습니다.

INSERT INTO [DB].[dbo].[TEST] 
        ([ID] 
        ,[DT]      
        ,[PID]      
        ,[AREA]) 
SELECT [ID]  
    ,[Date]  
    ,[PID]  
,[Area]  
FROM [OLDDB].[dbo].[TEST] 

동일한 작업을 수행하는 속도가 빨라집니다.

0

쿼리의 '테이블'(테이블 이름)을 '[테이블]'로 바꾸십시오. 테이블은 이미 예약 된 키워드이기 때문에 Visual Studio에서 이러한 테이블 이름에 대한 연결을 설정하지 못할 수도 있습니다.

관련 문제