2009-06-25 11 views
0

Ich erhalte diesen Fehler. Was ich tue, versucht, Daten aus einer Tabelle und einer db zu nehmen und in eine andere db und Tabelle zu legen. Die Tabellen sind nicht genau gleich. Ich verwende einen FETCH-Cursor, also hole ich die erste Zeile aus der Tabelle db1 und platziere dann jeden Spaltenwert in deklarierte Variablen. Dann führe ich die insert-Anweisung in die db2-Tabelle aus und hole den nächsten Wert. Es scheint alles ordnungsgemäß zu funktionieren, weil es gut durchläuft, aber am Ende bekomme ich diesen Fehler,Falsche Syntax in der Nähe des Schlüsselwortes 'Tabelle'

Falsche Syntax in der Nähe des Schlüsselwortes "Tabelle".

Die gesamte Transaktionsanweisung befindet sich in einem TRY/CATCH mit einem Fehlerbehandlungsausdruck im CATCH-Block. Ansonsten weiß ich nicht, was das verursacht. Bitte helfen Sie.

Hier ist der Code

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

Veröffentlichen Sie den Code mit der ungültigen Syntax. –

+2

Es ist offensichtlich, dass Ihr Problem ist, dass Sie keinen Code haben: kein SP und keine DDL. Wenn du es hättest, hättest du es gepostet, also hast du es offensichtlich nicht. –

+0

Sie sollten den Code, den Sie haben, Probleme mit – Kev

Antwort

0

Das Schlüsselwort table nicht sinnvoll ist, in entweder aus einer Tabelle auszuwählen oder in einer anderen eingeführt wird. Wo auch immer Sie es geschrieben haben, es gehört nicht dorthin.

6

Erste Sache ist, dass @TRAIN_ID nie in Ihrem Code deklariert

muss die skalare Variable deklarieren "@TRAIN_ID".

Zweitens brauchen Sie keinen Cursor, was ist falsch bei einer SET-basierten Operation? Es wird viel besser funktionieren !! Ersetzen Sie den Cursor Teil mit diesem

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

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

Sie auch hier ein zusätzliches Komma haben

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

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

sein sollte, aber wie ich schon sagte man keinen Cursor benötigen für diese

+0

Ich habe den Code mit der @TRAIN_ID bearbeitet, siehe oben. Es gibt immer noch den Fehler. Zweitens, das würde funktionieren, aber ich muss einige Logik in jeder Zeile, aber ich zuerst nur darauf achten, dass es richtig funktioniert aka, Holen der Zeile und Einfügen zuerst. Aber ich erhalte immer noch den Fehler. –

+0

Dan, kann die Logik leicht in die Set-basierte Lösung auch gesetzt werden. Cursor sollten fast nie für Einsätze verwendet werden, da sie extrem schlecht für die Leistung sind. – HLGEM

4

Und übrigens, Sie brauchen keinen Cursor dafür.

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

Dies macht den gleichen Job und ist schneller.

0

Versuchen Sie, die 'Tabelle' (Tabellenname) in den Abfragen durch '[Tabelle]' zu ersetzen. Da Tabelle bereits ein reserviertes Schlüsselwort ist, besteht die Möglichkeit, dass das Visual Studio möglicherweise keine Verbindung zu solchen Tabellennamen herstellen kann.

Verwandte Themen