From 3f28dcb98bf00bcd24fe315ade3e9ab57b449aa4 Mon Sep 17 00:00:00 2001 From: Leonel Atencio Date: Fri, 26 Jul 2019 13:11:34 -0500 Subject: [PATCH] Add support for try_cast function on qlalchemy.dialects.mssql --- lib/sqlalchemy/dialects/mssql/__init__.py | 2 ++ lib/sqlalchemy/dialects/mssql/base.py | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/sqlalchemy/dialects/mssql/__init__.py b/lib/sqlalchemy/dialects/mssql/__init__.py index 7cd1d34a55..27edc8fcb0 100644 --- a/lib/sqlalchemy/dialects/mssql/__init__.py +++ b/lib/sqlalchemy/dialects/mssql/__init__.py @@ -42,6 +42,7 @@ from .base import UNIQUEIDENTIFIER from .base import VARBINARY from .base import VARCHAR from .base import XML +from .base import TRY_CAST base.dialect = dialect = pyodbc.dialect @@ -79,5 +80,6 @@ __all__ = ( "UNIQUEIDENTIFIER", "SQL_VARIANT", "XML", + "TRY_CAST", "dialect", ) diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index 86116e6a17..03027a0c84 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -1173,6 +1173,10 @@ class SQL_VARIANT(sqltypes.TypeEngine): __visit_name__ = "SQL_VARIANT" +class TRY_CAST(elements.Cast): + pass + + # old names. MSDateTime = _MSDateTime MSDate = _MSDate @@ -1586,6 +1590,12 @@ class MSSQLCompiler(compiler.SQLCompiler): # Limit in mssql is after the select keyword return "" + def _try_cast(self, element, **kw): + return "TRY CAST (%s AS %s)" % ( + compiler.SQLCompiler.process(element.clause, **kw), + compiler.SQLCompiler.process(element.typeclause, **kw), + ) + def visit_select(self, select, **kwargs): """Look for ``LIMIT`` and OFFSET in a select statement, and if so tries to wrap it in a subquery with ``row_number()`` criterion. -- 2.47.3