关键字“table”附近的语法不正确

时间:2009-06-25 18:32:39

标签: sql sql-server sql-server-2005

我收到此错误。我正在做的是尝试从一个表和一个数据库中获取数据并将其放入另一个数据库和表中。表格并不完全相同。我正在使用FETCH游标,所以我从db1表中获取第一行,然后将每个列值放入声明的变量中。然后我将insert语句运行到db2表中并获取下一个值。这一切似乎都正常工作,因为它运行良好,但最后我得到了这个错误,

关键字“table”附近的语法不正确。

整个事务语句在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 个答案:

答案 0 :(得分: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

但就像我说的那样你不需要光标

答案 1 :(得分:4)

顺便说一句,你不需要光标。

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

这可以完成同样的工作并且更快。

答案 2 :(得分:0)

关键字table在从一个表中选择或插入另一个表时无效。无论你在哪里写它,它都不属于那里。

答案 3 :(得分:0)

尝试更换表格'使用' [表格]'的查询中的(表名)。由于Table已经是保留关键字,因此visual studio可能不允许您建立与此类表名的连接。