Skip to content

Handle SQL Server T-SQL

SQL Server's full T-SQL — variables, control-of-flow, MERGE, OUTPUT, OPENJSON, security policies — is parsed by the MSSQL vendor inside TGSqlParser.

Quick example

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
using gudusoft.gsqlparser;

var parser = new TGSqlParser(EDbVendor.dbvmssql);
parser.sqltext = """
    DECLARE @threshold INT = 1000;

    MERGE INTO target AS t
    USING source AS s ON t.id = s.id
    WHEN MATCHED AND s.amount > @threshold THEN
        UPDATE SET t.amount = s.amount
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (id, amount) VALUES (s.id, s.amount)
    OUTPUT $action, inserted.id, deleted.amount;
    """;

if (parser.parse() == 0)
    Console.WriteLine($"Parsed {parser.sqlstatements.size()} statement(s).");
else
    Console.Error.WriteLine(parser.Errormessage);

What gets parsed

The MSSQL vendor handles:

  • DML — SELECT (incl. TOP, FOR JSON, FOR XML), INSERT, UPDATE, DELETE, MERGE
  • DDL — CREATE/ALTER/DROP TABLE/VIEW/PROCEDURE/FUNCTION/INDEX/TRIGGER/SCHEMA/SEQUENCE
  • Procedural T-SQLDECLARE, SET, IF/ELSE, WHILE, BEGIN/END, BEGIN TRY/CATCH, RAISERROR, THROW, WAITFOR, GOTO, labels
  • CursorsDECLARE CURSOR (with STATIC, LOCAL, FORWARD_ONLY etc. options), OPEN, FETCH, CLOSE, DEALLOCATE
  • SecurityGRANT, REVOKE, DENY; CREATE/ALTER/DROP SECURITY POLICY
  • ExecutionEXECUTE, EXEC, sp_executesql, batch-numbered execute (module ;1)
  • JSONOPENJSON, FOR JSON PATH/AUTO, INCLUDE_NULL_VALUES, JSON_VALUE, etc.
  • Batch separatorsGO (with optional repeat count)

Statement types

The high-level statement classes live under gudusoft.gsqlparser.stmt.mssql:

Construct Class
CREATE PROCEDURE body TMssqlCreateProcedure
EXEC / EXECUTE TMssqlExecute
BEGIN..END block TMssqlBlock
MERGE TMergeSqlStatement
Cursor declarations TMssqlDeclareCursor

Cast parser.sqlstatements.get(i) to the matching type to access T-SQL-specific properties.

Sybase ASE

Sybase ASE shares grammar ancestry with MSSQL. Use EDbVendor.dbvsybase for ASE-specific syntax (raiserror, sp_* extensions, (...) around CREATE PROC parameters).

Common pitfalls

  • Smart quotes: T-SQL accepts U+2019 (') inside string literals on some collations. The parser handles this transparently.
  • Comma-vs-PIVOT in SELECT: prefer parenthesised subqueries when mixing PIVOT with regular tables; T-SQL grammar is ambiguous in this corner.
  • GO is a batch separator, not a statementparser.sqlstatements will contain the statements between successive GOs as separate top-level items.