Неверный синтаксис рядом с ключевым словом «таблица» - PullRequest
0 голосов
/ 25 июня 2009

Я получаю эту ошибку. Я пытаюсь взять данные из одной таблицы и одной базы данных и поместить их в другую базу данных и таблицу. Таблицы не совсем одинаковы. Я использую курсор FETCH, поэтому я выбираю первую строку из таблицы db1, а затем помещаю каждое значение столбца в объявленные переменные. Затем я запускаю оператор вставки в таблицу db2 и выбираю следующее значение. Кажется, все работает правильно, потому что все проходит нормально, но в конце я получаю эту ошибку,

Неверный синтаксис рядом с ключевым словом "таблица".

Весь оператор транзакции находится в TRY / CATCH с выражением обработки ошибок в блоке 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

Ответы [ 4 ]

6 голосов
/ 25 июня 2009

Во-первых, @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

Но, как я уже сказал, вам не нужен курсор для этого

4 голосов
/ 25 июня 2009

И, кстати, вам не нужен курсор для этого.

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

Это делает ту же самую работу и быстрее.

0 голосов
/ 24 января 2017

Попробуйте заменить 'Table' (Имя таблицы) в запросах на '[Table]'. Поскольку Table уже является зарезервированным ключевым словом, есть вероятность, что Visual Studio может не позволить установить соединение с такими именами таблиц.

0 голосов
/ 25 июня 2009

Ключевое слово table не полезно ни для выбора из одной таблицы, ни для вставки в другую. Где бы вы ни написали это, оно там не принадлежит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...