From 34e950765e9857fcf968d2c23db0082c866671aa Mon Sep 17 00:00:00 2001 From: =?utf8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Wed, 17 Dec 2025 22:11:33 -0600 Subject: [PATCH] Support for `IF EXISTS` in SQL Server 2016 (13.x) and later versions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Fixes: #13045 Signed-off-by: Edgar Ramírez Mondragón --- lib/sqlalchemy/dialects/mssql/base.py | 22 +++++++++++++++++----- test/dialect/mssql/test_compiler.py | 8 ++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index 94f265ebed..256f975fde 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -963,6 +963,7 @@ import codecs import datetime import operator import re +from typing import Any from typing import Literal from typing import overload from typing import TYPE_CHECKING @@ -1014,6 +1015,7 @@ from ...types import VARCHAR from ...util import update_wrapper if TYPE_CHECKING: + from ...sql.ddl import DropIndex from ...sql.dml import DMLState from ...sql.selectable import TableClause @@ -2688,11 +2690,21 @@ class MSDDLCompiler(compiler.DDLCompiler): return text - def visit_drop_index(self, drop, **kw): - return "\nDROP INDEX %s ON %s" % ( - self._prepared_index_name(drop.element, include_schema=False), - self.preparer.format_table(drop.element.table), - ) + def visit_drop_index(self, drop: DropIndex, **kw: Any) -> str: + index = drop.element + + text = "\nDROP INDEX " + + if ( + # only supported in 2016+ + self.dialect.server_version_info < MS_2016_VERSION + and drop.if_exists + ): + text += "IF EXISTS " + + text += self._prepared_index_name(index, include_schema=False) + text += " ON " + self.preparer.format_table(index.table) + return text def visit_create_table_as(self, element, **kw): prep = self.preparer diff --git a/test/dialect/mssql/test_compiler.py b/test/dialect/mssql/test_compiler.py index f8d9d54886..30e7f79a29 100644 --- a/test/dialect/mssql/test_compiler.py +++ b/test/dialect/mssql/test_compiler.py @@ -1534,6 +1534,14 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL): "DROP INDEX idx_foo ON bar.foo", ) + def test_drop_index_if_exists(self): + m = MetaData() + t1 = Table("foo", m, Column("x", Integer), schema="bar") + self.assert_compile( + schema.DropIndex(Index("idx_foo", t1.c.x), if_exists=True), + "DROP INDEX IF EXISTS idx_foo ON bar.foo", + ) + def test_index_extra_include_1(self): metadata = MetaData() tbl = Table( -- 2.47.3