Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions dbt/adapters/sqlserver/sqlserver_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
55 changes: 31 additions & 24 deletions dbt/include/sqlserver/macros/adapter/columns.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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 %}
Loading