From 25fc718abbc6775446f3c8717166d2ff0cc993a6 Mon Sep 17 00:00:00 2001 From: Axell <68310020+axellpadilla@users.noreply.github.com> Date: Mon, 29 Sep 2025 23:36:50 +0000 Subject: [PATCH] Add behavior flags property and optimize column alteration logic in SQLServerAdapter --- dbt/adapters/sqlserver/sqlserver_adapter.py | 21 ++++++- .../sqlserver/macros/adapter/columns.sql | 55 +++++++++++-------- 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/dbt/adapters/sqlserver/sqlserver_adapter.py b/dbt/adapters/sqlserver/sqlserver_adapter.py index 6f05c5017..9665b2474 100644 --- a/dbt/adapters/sqlserver/sqlserver_adapter.py +++ b/dbt/adapters/sqlserver/sqlserver_adapter.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import List, Optional import dbt.exceptions from dbt.adapters.base.impl import ConstraintSupport @@ -65,3 +65,22 @@ def valid_incremental_strategies(self): Not used to validate custom strategies defined by end users. """ return ["append", "delete+insert", "merge", "microbatch"] + + @property + def _behavior_flags(self) -> List[dict]: + """Adapter-specific behavior flags. These are merged with project overrides + by the BaseAdapter.behavior machinery. + """ + return [ + { + "name": "sqlserver__prefer_single_alter_column", + "default": False, + "source": "dbt-sqlserver", + "description": ( + "If true, prefer running a single " + "ALTER ... ALTER COLUMN for type expansions on tables. When false, " + "fall back to add/copy/drop/rename flow." + ), + "docs_url": None, + }, + ] diff --git a/dbt/include/sqlserver/macros/adapter/columns.sql b/dbt/include/sqlserver/macros/adapter/columns.sql index a98750e7e..5a35a1779 100644 --- a/dbt/include/sqlserver/macros/adapter/columns.sql +++ b/dbt/include/sqlserver/macros/adapter/columns.sql @@ -24,27 +24,34 @@ {% endmacro %} {% macro sqlserver__alter_column_type(relation, column_name, new_column_type) %} - - {%- set tmp_column = column_name + "__dbt_alter" -%} - {% set alter_column_type %} - alter {{ relation.type }} {{ relation }} add "{{ tmp_column }}" {{ new_column_type }}; - {%- endset %} - - {% set update_column %} - update {{ relation }} set "{{ tmp_column }}" = "{{ column_name }}"; - {%- endset %} - - {% set drop_column %} - alter {{ relation.type }} {{ relation }} drop column "{{ column_name }}"; - {%- endset %} - - {% set rename_column %} - exec sp_rename '{{ relation | replace('"', '') }}.{{ tmp_column }}', '{{ column_name }}', 'column' - {%- endset %} - - {% do run_query(alter_column_type) %} - {% do run_query(update_column) %} - {% do run_query(drop_column) %} - {% do run_query(rename_column) %} - -{% endmacro %} + {% if flags.sqlserver__prefer_single_alter_column and relation.type == 'table' %} + {% set alter_column_type_sql %} + alter {{ relation.type }} {{ relation }} alter column "{{ column_name }}" {{ new_column_type }}; + {%- endset %} + + {% do run_query(alter_column_type_sql) %} + {% else %} + {%- set tmp_column = column_name + "__dbt_alter" -%} + + {% set alter_column_type %} + alter {{ relation.type }} {{ relation }} add "{{ tmp_column }}" {{ new_column_type }}; + {%- endset %} + + {% set update_column %} + update {{ relation }} set "{{ tmp_column }}" = "{{ column_name }}"; + {%- endset %} + + {% set drop_column %} + alter {{ relation.type }} {{ relation }} drop column "{{ column_name }}"; + {%- endset %} + + {% set rename_column %} + exec sp_rename '{{ relation | replace('"', '') }}.{{ tmp_column }}', '{{ column_name }}', 'column' + {%- endset %} + + {% do run_query(alter_column_type) %} + {% do run_query(update_column) %} + {% do run_query(drop_column) %} + {% do run_query(rename_column) %} + {% endif %} + {% endmacro %}