2009-06-25 11 views
0

このエラーが表示されます。私がやっていることは、あるテーブルと1つのデータベースからデータを取り出し、別のデータベースとテーブルに配置しようとすることです。テーブルはまったく同じではありません。 FETCHカーソルを使用しているので、db1テーブルから最初の行をフェッチし、各列の値を宣言された変数に配置します。次に、INSERTステートメントをdb2テーブルに実行し、次の値をフェッチします。すべて正常に動作しているようですが、最終的にこのエラーが発生します。キーワード 'table'の近くの構文が正しくありません

キーワード 'table'の近くに構文が正しくありません。

トランザクションステートメント全体が、CATCHブロック内のエラー処理式を含むTRY/CATCHにあります。それ以外に私はこれを引き起こす原因を知らない。助けてください。ここ

キーワードtable 1つのテーブルから選択するか、別のへの挿入のいずれかにおいて有用でないコード

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

あります。どこに書いても、そこには属しません。

6

まず最初は@TRAIN_IDがスカラー変数を宣言する必要がありますあなたのコード

で宣言されないことである「@TRAIN_ID」。

秒は、カーソルを必要としないということですが、代わりにSETベースの操作で何が問題になりますか?それはもっと良いパフォーマンスを発揮します!!私はあなたがこの

のカーソルを必要としない言ったように、あなたもここに余分なコンマ

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

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

する必要があります持っているこの

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

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

でカーソル部品を交換してくださいしかし、

+0

上記の@TRAIN_IDでコードを編集しました。それでもエラーは出ます。 2つ目は、それぞれの行でいくつかのロジックを実行する必要がありますが、まず最初に行が正しく取り出されていることを確認してから、行を取り出して挿入します。しかし、私はまだエラーを受け取ります。 –

+0

Danでは、ロジックを簡単にセットベースのソリューションに組み込むことができます。カーソルはパフォーマンスのために極端に悪いので、挿入用にはほとんど使用しないでください。 – HLGEM

4

ところで、このためにカーソルは必要ありません。

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

これは同じ仕事をし、より高速です。

0

クエリの 'テーブル'(テーブル名)を '[テーブル]'に置き換えてください。テーブルはすでに予約済みのキーワードなので、ビジュアルスタジオではこのようなテーブル名への接続を許可しない可能性があります。

関連する問題