FIX: "Incorrect syntax near 'begi'" error message when you run a Transact-SQL statement in SQL Server 2012

Kehtib: SQL Server 2012 EnterpriseSQL Server 2012 Business IntelligenceSQL Server 2012 Developer

Microsoft SQL Server 2012 Service Pack 1 fixes are distributed as one downloadable file. Given that the fixes are cumulative, each new release contains all the hotfixes and all the security fixes that were included with the previous SQL Server 2012 Service Pack 1 fix release.

Symptoms


When you run a Transact-SQL statement in SQL Server 2012, you receive the following error message:

Incorrect syntax near 'begi'.

This issue occurs when the following conditions are true:
  • The statement contains an IF condition.
  • The IF condition does not contain BEGIN and END statements.
  • The IF condition is followed by a BEGIN TRY block.
  • The IF block is recompiled when you run the query. 

Resolution


Cumulative update information

Cumulative Update 4 for SQL Server 2012 SP1

The fix for this issue was first released in Cumulative Update 4. For more information about how to obtain this cumulative update package for SQL Server 2012 SP1, click the following article number to go to the article in the Microsoft Knowledge Base:
2833645 Cumulative update 4 for SQL Server 2012 SP1
Note Given that the builds are cumulative, each new fix release contains all the hotfixes and all the security fixes that were included with the previous SQL Server 2012 SP1 fix release. We recommend that you consider applying the most recent fix release that contains this hotfix. For more information, click the following article number to go to the article in the Microsoft Knowledge Base:
2772858 The SQL Server 2012 builds that were released after SQL Server 2012 Service Pack 1 was released

Status


Microsoft has confirmed that this is a problem in the Microsoft products that are listed in the "Applies to" section.

More Information


To reproduce this issue, run the following Transact-SQL statements in SQL Server 2012: 


DECLARE @i INT

IF object_id('tempdb..#temptable') IS NOT NULL
DROP TABLE #temptable

CREATE TABLE #temptable (id INT)
INSERT INTO #temptable VALUES (1),(2),(3);

IF year(getdate())=2012 SELECT @i=(SELECT COUNT(*) AS nr FROM #temptable);
BEGIN TRY
SELECT 'message'
END TRY

BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH

Workaround


To work around this issue, add BEGIN and END statements to the IF condition.

References


For more information about the Incremental Servicing Model for SQL Server, click the following article number to go to the article in the Microsoft Knowledge Base:
935897 An Incremental Servicing Model is available from the SQL Server team to deliver hotfixes for reported problems
For more information about the naming schema for SQL Server updates, click the following article number to go to the article in the Microsoft Knowledge Base:
822499 Naming schema for Microsoft SQL Server software update packages
For more information about software update terminology, click the following article number to go to the article in the Microsoft Knowledge Base:
824684 Description of the standard terminology that is used to describe Microsoft software updates