【问题标题】:SQLSTATE 42000 (Error 102) Incorrect syntax near ')'SQLSTATE 42000(错误 102)')' 附近的语法不正确
【发布时间】:2014-03-14 09:08:43
【问题描述】:

常规设置

这是一个奇怪的问题,我很抱歉。我实际上花了很多时间搜索和分析我们的代码。我们有一个调用存储过程的工作,它选择一些数据,然后调用其他存储过程(其中一些名称是使用选择语句检索的,因为它们可能会有所不同)。它调用了大约 20 个不同的这些存储过程大约 10'000 次(总结了不同的调用),只是改变了参数。这些存储过程检索一些数据,然后将数据插入到我们的数据库中。

SQL-Server 版本

这在 Microsoft SQL-Server 2005 中运行良好,但是不久之后我们升级到 SQL-Server 2012 (11.0.3000.0) 并且从那时起这个问题似乎开始出现,或者我们之前根本没有意识到它。

错误

所以我们每次执行都会得到这个错误:

Executed as user: #DATABASEUSER_RMV_FOR_STACKOVERFLOW. Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102).  The step failed.

我知道这是非常少的信息,但我们的脚本非常大,我想问问你们中的一些人想找出问题所在。

到目前为止我做了什么

我查看了脚本,做了一些试运行(b/c 整个脚本运行了大约一个小时......(这是一项夜间工作))。试运行效果很好。此外,我们几乎没有左括号,而且它们总是关闭。一旦它检索到数据,运行一个小时后它就会因为这个错误而“崩溃”......

所以我做了什么:

  • 空运行(没有实际加载数据,但调用了大部分存储过程)- 好的,成功
  • 直接调用 main-store-procedure(不是作为作业)- 也不起作用
  • 通读代码搜索括号错误 - 好的,没有发现括号错误
  • 使用不同的用户运行:db-admin,我的用户 - 也没有工作
  • 通常通过 Google/Stackoverflow/通过 stackexchange 进行搜索

问题

看起来脚本必须做的所有事情都正确且完整地完成了,所以我们不明白为什么它不返回“成功”并向我们抛出此错误消息。

我可以想象它可能检索到一个包含转义字符的字段...这有意义吗?

我可以设置一个通用断点,一旦发生这个“错误”,脚本的执行就会中断,并告诉我是什么数据导致了这个错误......就像在 Visual Studio 中调试代码一样?

所以我的主要问题是:您能否给我一个提示/帮助如何以最佳方式处理此错误?我该怎么办?


工作

EXEC MY_SCHEME.dbo.MY_STOREDPROCEDURE_MAIN

MY_STOREDPROCEDURE_MAIN

SET NOCOUNT ON;

-- Insert statements for procedure here
DECLARE @userId INT
DECLARE @fullHistory BIT

SELECT @userId = userId
FROM MY_SCHEME.dbo.USERS
WHERE loginname = 'SOME_NAME'

SET @fullHistory = 0

EXECUTE MY_SCHEME.dbo.spStartMyNightlyJob @userId=@userId, @processFullHistory=@fullHistory

spStartMyNightlyJob

PROCEDURE [dbo].[spStartMyNightlyJob]
    @userId INT,
    @processFullHistory BIT
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @logReport VARCHAR(255)
    SET @logReport = 'NightlyJob'

    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('=======================================================================================================', @logReport)
    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('NightlyJob started at ' + CAST(GETDATE() AS VARCHAR), @logReport)
    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('=======================================================================================================', @logReport)

    DECLARE taskCursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR 
        SELECT
            r.taskId, link.Id, i.Description, link.externalId, rdef.name, rdir.fromDB, rdir.toDB,
            rdef.procedureName, rfs.fillStrategyId, rp.parameterId
        FROM MY_TASK r
        LEFT OUTER JOIN some_table_1 link
        ON r.LinkId = link.LinkId
        LEFT OUTER JOIN some_table_2 i
        ON link.Id = i.Id
        LEFT OUTER JOIN some_table_3_TASK_DEFINITION rdef
        ON r.taskDefinitionId = rdef.taskDefinitionId
        LEFT OUTER JOIN some_table_4_TASK_DIRECTION rdir
        ON rdef.directionId = rdir.directionId
        LEFT OUTER JOIN some_table_5_FILL_STRATEGY rfs
        ON rdef.fillStrategyId = rfs.fillStrategyId
        LEFT OUTER JOIN some_table_6_PARAMETER rp
        ON rdef.parameterId = rp.parameterId
        WHERE r.active = 1
        AND rdef.taskDefinitionId NOT LIKE 17


    DECLARE @taskId INT
    DECLARE @someOtherId INT
    DECLARE @someOtherName VARCHAR(255)
    DECLARE @externalSomeOtherId INT
    DECLARE @taskName VARCHAR(50)
    DECLARE @fromDB VARCHAR(50)
    DECLARE @toDB VARCHAR(50)
    DECLARE @storedProcedure VARCHAR(100)
    DECLARE @fillStrategyId INT
    DECLARE @parameterId INT

    OPEN taskCursor
    FETCH NEXT FROM taskCursor
    INTO
        @taskId, @someOtherId , @someOtherName , @externalSomeOtherId , @taskName, @fromDB, @toDB, @storedProcedure,
        @fillStrategyId, @parameterId

    WHILE @@FETCH_STATUS = 0 BEGIN
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('-------------------------------------------------------------------------------------------------------', @logReport)
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('Performing task: ' + @taskName, @logReport)
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('Nightly Job between: ' + @fromDB + ' -> ' + @toDB, @logReport)
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('Executive procedure: ' + @storedProcedure, @logReport)
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('Involved : ' + @someOtherName + ' (' + CAST(@someOtherId AS VARCHAR) + ')', @logReport)

        EXECUTE @storedProcedure @someOtherId , @externalSomeOtherId , @fillStrategyId, @parameterId, @userId, @processFullHistory

        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('', @logReport)

        SET @taskId = NULL
        SET @someOtherId = NULL
        SET @someOtherName = NULL
        SET @externalSomeOtherId = NULL
        SET @taskName = NULL
        SET @fromDB = NULL
        SET @toDB = NULL
        SET @storedProcedure = NULL
        SET @fillStrategyId = NULL
        SET @parameterId = NULL

        FETCH NEXT FROM taskCursor
        INTO
            @taskId, @taskId , @someOtherName , @externalSomeOtherId , @taskName, @fromDB, @toDB, @storedProcedure,
            @fillStrategyId, @parameterId
    END
    CLOSE taskCursor
    DEALLOCATE taskCursor

    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('=======================================================================================================', @logReport)
    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('NightlyJob finished at ' + CAST(GETDATE() AS VARCHAR), @logReport)
    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('=======================================================================================================', @logReport)
    RETURN 0
END

在此之后,它会打开大约 15 个不同的存储过程,具体取决于每天晚上“定义”哪些任务..

如果我注释掉它的实际执行

EXECUTE @storedProcedure @someOtherId , @externalSomeOtherId , @fillStrategyId, @parameterId, @userId, @processFullHistory

然后它完成而没有错误。

已经感谢您查看我的问题 ;-)

【问题讨论】:

  • 我认为问题出在您的第二个 INSERT 声明上。
  • 因为CAST(GETDATE() AS VARCHAR)?
  • 是的。可能你应该用单引号括起来。
  • 你的意思是像:''' + CAST(GETDATE() AS VARCHAR) + '''。因为它正在写Log-Table(或者你认为即使它正在写入日志也可能导致崩溃?)
  • 试试这个没有坏处。请尝试让我知道。

标签: sql sql-server tsql stored-procedures


【解决方案1】:

问题在于您的第二个插入语句。用这个替换旧的。

create table #temp1 (text nvarchar(100),report nvarchar(500))
INSERT INTO #temp1 (text, report) VALUES('NightlyJob started at ' + ''  + CAST(GETDATE() AS VARCHAR) + '','Report')
select * from #temp1

【讨论】:

  • 感谢 Aishvaraya 的支持 - 抱歉,我没有尽快回复。我尝试了您建议的代码......因为它可以工作,但如果我将它插入我的代码中,我仍然会遇到我的另一个错误。目前,我认为该错误位于“执行”完成的 WHILE 循环中……如果注释掉它可以工作(没有执行部分)但是……执行时我得到了错误。我现在正在尝试找到一种模式和更多信息来找出问题所在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多