How to fix Error 111 on Windows Server 2025 / Windows 11

Troubleshooting Guide: Error 111 – “‘%ls’ must be the first statement in a query batch”

Why This Error Happens

This error occurs when certain T-SQL statements—such as CREATE PROCEDURE, CREATE VIEW, CREATE FUNCTION, CREATE TRIGGER, or CREATE SCHEMA—are not placed as the very first statement in a query batch. SQL Server 2025’s parser enforces strict batch-scoping rules for object-creation DDL statements, meaning any preceding statement (even a comment block that isn’t properly formatted, or a USE statement without a GO separator) will trigger this error. This is typically a query-authoring issue rather than a server configuration or corruption problem, but it can also surface due to improperly generated scripts from ORM tools or migration frameworks.

Step-by-Step Resolution Guide

Step 1: Identify the Offending Statement

  • Open the query in SSMS or Azure Data Studio and locate the CREATE PROCEDURE, CREATE VIEW, CREATE FUNCTION, or CREATE TRIGGER statement referenced in the error message.
  • Check the lines immediately above it for any other executable statements (e.g., SELECT, DECLARE, SET, IF, USE).

Step 2: Insert a Batch Separator

  • Add a GO statement immediately before the CREATE statement to force it into its own batch.
  • Example fix:
  USE MyDatabase;
  GO
  CREATE PROCEDURE dbo.MyProc
  AS
  BEGIN
      SELECT 1;
  END
  GO
  • Ensure there is only one CREATE object statement per batch—do not combine multiple CREATE PROCEDURE statements in a single batch even if separated by semicolons.

Step 3: Review Semicolon Usage and Comments

  • Confirm any multi-line comments (/* ... */) preceding the CREATE statement are fully closed; an unclosed comment can cause the parser to misidentify batch boundaries.
  • Remove stray semicolons or empty statements before the CREATE keyword, as SQL Server 2025 treats ; as a statement terminator that can inadvertently end up mid-batch.

Step 4: Validate Script Generation Tools

  • If the script was auto-generated (e.g., via Entity Framework migrations, dbForge, or SSDT), check the export/generation settings to ensure GO separators are inserted correctly between DDL statements.
  • Regenerate the script with “Include batch separators” enabled if using SSMS’s “Generate Scripts” wizard (Database → Tasks → Generate Scripts → Advanced → Script Statement Type).

Step 5: Re-run in Isolation

  • Copy just the problematic CREATE statement into a new query window by itself and execute it to confirm it runs cleanly without any preceding statements.
  • Once validated, reintegrate it into the full script with proper GO batch separation.

Alternative or Verification Steps

  • Verify the fix by executing the corrected script end-to-end in SSMS with SQLCMD Mode enabled (Query menu → SQLCMD Mode) to ensure GO separators are respected exactly as written.
  • If using a deployment pipeline (e.g., SSDT/DACPAC or Flyway), run a dry-run/validation build first, as these tools often auto-insert correct batch separators and can bypass manual scripting errors entirely.