use `cached_property` to reuse `get_connections` value in `mssql` provider (#39575)

* use self.conn instead of calling get_connections

* rename property
diff --git a/airflow/providers/microsoft/mssql/hooks/mssql.py b/airflow/providers/microsoft/mssql/hooks/mssql.py
index 91952f5..d4deb60 100644
--- a/airflow/providers/microsoft/mssql/hooks/mssql.py
+++ b/airflow/providers/microsoft/mssql/hooks/mssql.py
@@ -19,12 +19,16 @@
 
 from __future__ import annotations
 
-from typing import Any
+from functools import cached_property
+from typing import TYPE_CHECKING, Any
 
 import pymssql
 
 from airflow.providers.common.sql.hooks.sql import DbApiHook
 
+if TYPE_CHECKING:
+    from airflow.models import Connection
+
 
 class MsSqlHook(DbApiHook):
     """
@@ -53,6 +57,15 @@
         self.schema = kwargs.pop("schema", None)
         self._sqlalchemy_scheme = sqlalchemy_scheme
 
+    @cached_property
+    def connection(self) -> Connection:
+        """
+        Get the airflow connection object.
+
+        :return: The connection object.
+        """
+        return self.get_connection(getattr(self, self.conn_name_attr))
+
     @property
     def connection_extra_lower(self) -> dict:
         """
@@ -60,8 +73,7 @@
 
         This is used internally for case-insensitive access of mssql params.
         """
-        conn = self.get_connection(self.mssql_conn_id)  # type: ignore[attr-defined]
-        return {k.lower(): v for k, v in conn.extra_dejson.items()}
+        return {k.lower(): v for k, v in self.connection.extra_dejson.items()}
 
     @property
     def sqlalchemy_scheme(self) -> str:
@@ -94,9 +106,8 @@
 
     def get_conn(self) -> pymssql.connect:
         """Return ``pymssql`` connection object."""
-        conn = self.get_connection(self.mssql_conn_id)  # type: ignore[attr-defined]
-
-        conn = pymssql.connect(
+        conn = self.connection
+        return pymssql.connect(
             server=conn.host,
             user=conn.login,
             password=conn.password,