diff --git a/dbt/adapters/sqlserver/sqlserver_adapter.py b/dbt/adapters/sqlserver/sqlserver_adapter.py index b5a90c85d..5b63f620b 100644 --- a/dbt/adapters/sqlserver/sqlserver_adapter.py +++ b/dbt/adapters/sqlserver/sqlserver_adapter.py @@ -113,6 +113,17 @@ def _behavior_flags(self) -> List[dict]: 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, + }, { "name": "enable_safe_type_expansion", "default": False, 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 %}