SA0151 : Statements appear after procedures main BEGIN/END block. Possible missing GO command |
![]() |
Misplaced statements outside BEGIN/END blocks in stored procedures can lead to logical errors and reduce code clarity.

It’s important to clearly define the boundaries of a stored procedure using BEGIN and END blocks. When additional T-SQL statements appear outside these blocks and after the main procedure code, it can lead to unexpected behavior, such as unintentional inclusion of these statements in the stored procedure’s scope.
For example:
1CREATE PROCEDURE SampleProcedure 2AS 3BEGIN 4 SELECT * FROM Employees; 5END 6SELECT * FROM Departments; -- Problematic statement
In this example, the SELECT * FROM Departments; statement may inadvertently become part of the stored procedure, potentially indicating a missing GO command to delineate batches. This can lead to:
-
Confusion about which statements belong to the stored procedure.
-
Unanticipated execution results if additional statements were not intended to be part of the procedure.

Ensure that all T-SQL statements within a stored procedure are properly enclosed within BEGIN and END blocks, and separate additional independent statements using the GO command to prevent unintended inclusion in the stored procedure’s scope.
Follow these steps to address the issue:
-
Review the stored procedure to identify any T-SQL statements that should not be included within the procedure’s BEGIN and END blocks.
-
If you find statements outside these blocks, determine if they were meant to be part of the stored procedure or if they should be executed separately.
-
Add a GO command after the END block of the stored procedure to clearly separate subsequent, unrelated T-SQL statements.
For example:
1-- Corrected stored procedure with GO command 2CREATE PROCEDURE SampleProcedure 3AS 4BEGIN 5 SELECT * FROM Employees; 6END 7GO 8-- Independent statement, no longer part of the stored procedure 9SELECT * FROM Departments;

The rule has a Batch scope and is applied only on the SQL script.

Rule has no parameters.

The rule does not need Analysis Context or SQL Connection.


Design Rules, Security Rules

There is no additional info for this rule.

SQL
1ALTER PROCEDURE dbo.FooGetTableA 2 ( 3 @Parameter varchar(4) 4 ) 5AS 6BEGIN 7 SELECT Column1 8 FROM dbo.TableA 9 WHERE Column2 = @Parameter 10END 11 12EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Some description for the procedure.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'FooGetTableA' |

Message | Line | Column | |
---|---|---|---|
1 | SA0151 : Possible missing GO statement. Statement appears after procedure’s FooGetTableA main BEGIN/END block. | 12 | 0 |
