dbt-sqlserver 1.12.0rc1__tar.gz → 1.12.0rc2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. {dbt_sqlserver-1.12.0rc1/dbt_sqlserver.egg-info → dbt_sqlserver-1.12.0rc2}/PKG-INFO +1 -1
  2. dbt_sqlserver-1.12.0rc2/dbt/adapters/sqlserver/__version__.py +1 -0
  3. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_adapter.py +16 -0
  4. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_relation.py +9 -0
  5. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/apply_grants.sql +3 -3
  6. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/apply_masks.sql +3 -3
  7. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/columns.sql +1 -1
  8. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/indexes.sql +63 -42
  9. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/metadata.sql +3 -3
  10. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/relation.sql +12 -5
  11. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/schema.sql +3 -3
  12. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/hooks.sql +5 -1
  13. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/incremental/incremental.sql +36 -3
  14. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/unit_test/unit_test_create_table_as.sql +1 -1
  15. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/tests.sql +4 -3
  16. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/unit_tests.sql +6 -4
  17. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/relations/table/create.sql +22 -5
  18. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/relations/views/create.sql +1 -1
  19. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2/dbt_sqlserver.egg-info}/PKG-INFO +1 -1
  20. dbt_sqlserver-1.12.0rc1/dbt/adapters/sqlserver/__version__.py +0 -1
  21. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/LICENSE +0 -0
  22. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/README.md +0 -0
  23. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/__init__.py +0 -0
  24. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/__init__.py +0 -0
  25. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/py.typed +0 -0
  26. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/relation_configs/__init__.py +0 -0
  27. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/relation_configs/index.py +0 -0
  28. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/relation_configs/policies.py +0 -0
  29. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_auth.py +0 -0
  30. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_backend.py +0 -0
  31. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_column.py +0 -0
  32. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_configs.py +0 -0
  33. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_connections.py +0 -0
  34. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_constants.py +0 -0
  35. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_credentials.py +0 -0
  36. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_helpers.py +0 -0
  37. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_mask.py +0 -0
  38. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/adapters/sqlserver/sqlserver_runtime.py +0 -0
  39. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/__init__.py +0 -0
  40. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/dbt_project.yml +0 -0
  41. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/catalog.sql +0 -0
  42. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/persist_docs.sql +0 -0
  43. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/show.sql +0 -0
  44. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/adapters/validate_sql.sql +0 -0
  45. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/functions/helpers.sql +0 -0
  46. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/functions/scalar.sql +0 -0
  47. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/incremental/incremental_strategies.sql +0 -0
  48. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/incremental/merge.sql +0 -0
  49. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/table/columns_spec_ddl.sql +0 -0
  50. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/table/table.sql +0 -0
  51. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/table/table_dml_refresh.sql +0 -0
  52. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/unit_test/get_fixture_sql.sql +0 -0
  53. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/view/create_view_as.sql +0 -0
  54. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/models/view/view.sql +0 -0
  55. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/snapshots/helpers.sql +0 -0
  56. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/snapshots/snapshot.sql +0 -0
  57. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/snapshots/snapshot_merge.sql +0 -0
  58. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/materializations/snapshots/strategies.sql +0 -0
  59. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/relations/seeds/helpers.sql +0 -0
  60. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/relations/table/clone.sql +0 -0
  61. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/any_value.sql +0 -0
  62. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/array_construct.sql +0 -0
  63. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/cast_bool_to_text.sql +0 -0
  64. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/concat.sql +0 -0
  65. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/date_trunc.sql +0 -0
  66. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/dateadd.sql +0 -0
  67. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/get_tables_by_pattern.sql +0 -0
  68. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/hash.sql +0 -0
  69. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/last_day.sql +0 -0
  70. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/length.sql +0 -0
  71. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/listagg.sql +0 -0
  72. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/position.sql +0 -0
  73. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/safe_cast.sql +0 -0
  74. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/split_part.sql +0 -0
  75. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/macros/utils/timestamps.sql +0 -0
  76. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt/include/sqlserver/profile_template.yml +0 -0
  77. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt_sqlserver.egg-info/SOURCES.txt +0 -0
  78. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt_sqlserver.egg-info/dependency_links.txt +0 -0
  79. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt_sqlserver.egg-info/requires.txt +0 -0
  80. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/dbt_sqlserver.egg-info/top_level.txt +0 -0
  81. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/pyproject.toml +0 -0
  82. {dbt_sqlserver-1.12.0rc1 → dbt_sqlserver-1.12.0rc2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dbt-sqlserver
3
- Version: 1.12.0rc1
3
+ Version: 1.12.0rc2
4
4
  Summary: A Microsoft SQL Server adapter plugin for dbt
5
5
  Author: Mikael Ene, Anders Swanson, Sam Debruyn, Cor Zuurmond, Cody Scott
6
6
  License: MIT
@@ -0,0 +1 @@
1
+ version = "1.12.0rc2"
@@ -188,6 +188,22 @@ class SQLServerAdapter(SQLAdapter):
188
188
  ]
189
189
  return columns
190
190
 
191
+ @classmethod
192
+ def quote(cls, identifier: str) -> str:
193
+ """Double-quote an identifier, doubling any embedded double quote.
194
+
195
+ ``SQLAdapter.quote`` interpolates the identifier verbatim, so a name
196
+ containing a ``"`` would close the quoted identifier early and the
197
+ remainder would parse as SQL. T-SQL escapes a delimiter by doubling
198
+ it -- the same rule ``QUOTENAME()`` applies to brackets -- so
199
+ ``ab"cd`` must render as ``"ab""cd"``.
200
+
201
+ This is the quoting used by every macro that formats an identifier
202
+ (see #785). Relation rendering escapes nothing, since it goes through
203
+ ``BaseRelation.quote_character`` upstream rather than this method.
204
+ """
205
+ return '"{}"'.format(str(identifier).replace('"', '""'))
206
+
191
207
  @classmethod
192
208
  def convert_boolean_type(cls, agate_table, col_idx):
193
209
  return "bit"
@@ -26,6 +26,15 @@ class SQLServerRelation(BaseRelation):
26
26
  def get_relation_type(cls) -> Type[SQLServerRelationType]:
27
27
  return SQLServerRelationType
28
28
 
29
+ def quoted(self, identifier):
30
+ """Quote a path part, doubling any embedded quote character (#785).
31
+
32
+ Not delegated to super(): that wraps verbatim, so pre-escaping the
33
+ input would double-escape if upstream ever starts escaping too.
34
+ """
35
+ quote_char = self.quote_character
36
+ return f"{quote_char}{str(identifier).replace(quote_char, quote_char * 2)}{quote_char}"
37
+
29
38
  def _render_limited_alias(self) -> str:
30
39
  if self.disable_empty_relation_aliases:
31
40
  return ""
@@ -48,7 +48,7 @@
48
48
  {%- macro sqlserver__get_grant_sql(relation, privilege, grantees) -%}
49
49
  {%- set grantees_safe = [] -%}
50
50
  {%- for grantee in grantees -%}
51
- {%- set grantee_safe = "[" ~ grantee ~ "]" -%}
51
+ {%- set grantee_safe = adapter.quote(grantee) -%}
52
52
  {%- do grantees_safe.append(grantee_safe) -%}
53
53
  {%- endfor -%}
54
54
  grant {{ privilege }} on {{ relation }} to {{ grantees_safe | join(', ') }}
@@ -57,7 +57,7 @@
57
57
  {%- macro sqlserver__get_revoke_sql(relation, privilege, grantees) -%}
58
58
  {%- set grantees_safe = [] -%}
59
59
  {%- for grantee in grantees -%}
60
- {%- set grantee_safe = "[" ~ grantee ~ "]" -%}
60
+ {%- set grantee_safe = adapter.quote(grantee) -%}
61
61
  {%- do grantees_safe.append(grantee_safe) -%}
62
62
  {%- endfor -%}
63
63
  revoke {{ privilege }} on {{ relation }} from {{ grantees_safe | join(', ') }}
@@ -66,6 +66,6 @@
66
66
  {% macro get_provision_sql(relation, privilege, grantees) %}
67
67
  {% for grantee in grantees %}
68
68
  if not exists(select name from sys.database_principals where name = '{{ grantee }}')
69
- create user [{{ grantee }}] from external provider;
69
+ create user {{ adapter.quote(grantee) }} from external provider;
70
70
  {% endfor %}
71
71
  {% endmacro %}
@@ -33,7 +33,7 @@
33
33
  c.name as name,
34
34
  c.masking_function as masking_function
35
35
  from sys.masked_columns c {{ information_schema_hints() }}
36
- where c.object_id = OBJECT_ID('{{ relation.schema }}.{{ relation.identifier }}')
36
+ where c.object_id = OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}')
37
37
  {% endmacro %}
38
38
 
39
39
 
@@ -47,7 +47,7 @@
47
47
  from sys.index_columns ic {{ information_schema_hints() }}
48
48
  inner join sys.columns col {{ information_schema_hints() }}
49
49
  on col.object_id = ic.object_id and col.column_id = ic.column_id
50
- where ic.object_id = OBJECT_ID('{{ relation.schema }}.{{ relation.identifier }}')
50
+ where ic.object_id = OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}')
51
51
  and ic.is_included_column = 0
52
52
  {% endcall %}
53
53
  {% set result = [] %}
@@ -64,7 +64,7 @@
64
64
  {% call statement('get_unmaskable_columns', fetch_result=True) %}
65
65
  select col.name as name
66
66
  from sys.columns col {{ information_schema_hints() }}
67
- where col.object_id = OBJECT_ID('{{ relation.schema }}.{{ relation.identifier }}')
67
+ where col.object_id = OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}')
68
68
  and (
69
69
  col.is_computed = 1
70
70
  or col.is_filestream = 1
@@ -62,7 +62,7 @@
62
62
  drop column "{{ column_name }}";
63
63
  {%- endset %}
64
64
  {% set rename_column %}
65
- exec sp_rename '{{ relation | replace('"', '') }}.{{ tmp_column }}', '{{ column_name }}', 'column'
65
+ exec sp_rename '{{ escape_single_quotes(relation.include(database=False)) }}.{{ escape_single_quotes(adapter.quote(tmp_column)) }}', '{{ escape_single_quotes(column_name) }}', 'column'
66
66
  {%- endset %}
67
67
 
68
68
  {% do run_query(add_column) %}
@@ -1,17 +1,28 @@
1
+ {#- Quoted, comma-separated column list for index DDL. -#}
2
+ {% macro quote_column_list(columns) -%}
3
+ {%- set quoted = [] -%}
4
+ {%- for column in columns -%}
5
+ {%- do quoted.append(adapter.quote(column)) -%}
6
+ {%- endfor -%}
7
+ {{- quoted | join(', ') -}}
8
+ {%- endmacro %}
9
+
10
+
1
11
  {% macro sqlserver__create_clustered_columnstore_index(relation) -%}
12
+ {#- cci_name embeds the schema, so it must be quoted as an identifier
13
+ (raw only in the string comparison below) -- issue #409 -#}
2
14
  {%- set cci_name = (relation.schema ~ '_' ~ relation.identifier ~ '_cci') | replace(".", "") | replace(" ", "") -%}
3
15
  {%- set relation_name = relation.include(database=False) -%}
4
- {%- set full_relation = '"' ~ relation.schema ~ '"."' ~ relation.identifier ~ '"' -%}
5
- use [{{ relation.database }}];
16
+ {{ get_use_database_sql(relation.database) }}
6
17
  if EXISTS (
7
18
  SELECT *
8
19
  FROM sys.indexes {{ information_schema_hints() }}
9
- WHERE name = '{{cci_name}}'
10
- AND object_id=object_id('{{relation_name}}')
20
+ WHERE name = '{{ escape_single_quotes(cci_name) }}'
21
+ AND object_id=object_id('{{ escape_single_quotes(relation_name) }}')
11
22
  )
12
- DROP index {{full_relation}}.{{cci_name}}
13
- CREATE CLUSTERED COLUMNSTORE INDEX {{cci_name}}
14
- ON {{full_relation}}
23
+ DROP index {{ relation_name }}.{{ adapter.quote(cci_name) }}
24
+ CREATE CLUSTERED COLUMNSTORE INDEX {{ adapter.quote(cci_name) }}
25
+ ON {{ relation_name }}
15
26
  {% endmacro %}
16
27
 
17
28
  {% macro drop_xml_indexes() -%}
@@ -58,15 +69,25 @@
58
69
 
59
70
  {{ log("Running drop_fk_constraints() macro...") }}
60
71
 
61
- {# The schema filter applies to the referenced table (this model). The
62
- constraint itself is dropped from the referencing (parent) table, which
63
- may legitimately live in another schema, so it is not filtered. #}
72
+ {# Both directions are dropped (issue #632): the inbound keys of other
73
+ tables that reference this model, and this model's own outbound keys.
74
+ An inbound key blocks dropping this table or its primary key; an
75
+ outbound one blocks a truncate/rebuild of the table it points at and
76
+ would otherwise survive a rebuild of this one.
77
+
78
+ The schema filter applies to this model's table only, so same-named
79
+ tables in other schemas keep their constraints. The counterparty of
80
+ either key may legitimately live in another schema and is not filtered.
81
+ ALTER TABLE always targets the constraint's own schema and parent table,
82
+ which is correct in both directions. #}
64
83
 
65
84
  declare @drop_fk_constraints nvarchar(max);
66
85
  select @drop_fk_constraints = (
67
86
  select 'IF OBJECT_ID(''' + REPLACE(QUOTENAME(SCHEMA_NAME(sys.foreign_keys.[schema_id])) + '.' + QUOTENAME(sys.foreign_keys.[name]), '''', '''''') + ''', ''F'') IS NOT NULL ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(sys.foreign_keys.[schema_id])) + '.' + QUOTENAME(OBJECT_NAME(sys.foreign_keys.[parent_object_id])) + ' DROP CONSTRAINT ' + QUOTENAME(sys.foreign_keys.[name]) + ';'
68
- from sys.foreign_keys
69
- inner join sys.tables on sys.foreign_keys.[referenced_object_id] = sys.tables.[object_id]
87
+ from sys.foreign_keys {{ information_schema_hints() }}
88
+ inner join sys.tables {{ information_schema_hints() }}
89
+ on sys.foreign_keys.[referenced_object_id] = sys.tables.[object_id]
90
+ or sys.foreign_keys.[parent_object_id] = sys.tables.[object_id]
70
91
  where SCHEMA_NAME(sys.tables.[schema_id]) = '{{ this.schema }}'
71
92
  and sys.tables.[name] = '{{ this.table }}'
72
93
  for xml path('')
@@ -90,8 +111,8 @@
90
111
  declare @drop_pk_constraints nvarchar(max);
91
112
  select @drop_pk_constraints = (
92
113
  select 'IF INDEXPROPERTY(' + CONVERT(VARCHAR(MAX), sys.tables.[object_id]) + ', ' + QUOTENAME(sys.indexes.[name], '''') + ', ''IndexId'') IS NOT NULL ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(sys.tables.[schema_id])) + '.' + QUOTENAME(sys.tables.[name]) + ' DROP CONSTRAINT ' + QUOTENAME(sys.indexes.[name]) + ';'
93
- from sys.indexes
94
- inner join sys.tables on sys.indexes.[object_id] = sys.tables.[object_id]
114
+ from sys.indexes {{ information_schema_hints() }}
115
+ inner join sys.tables {{ information_schema_hints() }} on sys.indexes.[object_id] = sys.tables.[object_id]
95
116
  where sys.indexes.is_primary_key = 1
96
117
  and SCHEMA_NAME(sys.tables.[schema_id]) = '{{ this.schema }}'
97
118
  and sys.tables.[name] = '{{ this.table }}'
@@ -142,7 +163,7 @@
142
163
  {% endif %}
143
164
  clustered index
144
165
  {{ idx_name }}
145
- on {{ this }} ({{ '[' + columns|join("], [") + ']' }})
166
+ on {{ this }} ({{ quote_column_list(columns) }})
146
167
  end
147
168
  {%- endmacro %}
148
169
 
@@ -170,9 +191,9 @@
170
191
  begin
171
192
  create nonclustered index
172
193
  {{ idx_name }}
173
- on {{ this }} ({{ '[' + columns|join("], [") + ']' }})
194
+ on {{ this }} ({{ quote_column_list(columns) }})
174
195
  {% if includes -%}
175
- include ({{ '[' + includes|join("], [") + ']' }})
196
+ include ({{ quote_column_list(includes) }})
176
197
  {% endif %}
177
198
  end
178
199
  {% endmacro %}
@@ -180,32 +201,32 @@
180
201
 
181
202
  {% macro drop_fk_indexes_on_table(relation) -%}
182
203
  {% call statement('find_references', fetch_result=true) %}
183
- USE [{{ relation.database }}];
204
+ {{ get_use_database_sql(relation.database) }}
184
205
  SELECT obj.name AS FK_NAME,
185
206
  sch.name AS [schema_name],
186
207
  tab1.name AS [table],
187
208
  col1.name AS [column],
188
209
  tab2.name AS [referenced_table],
189
210
  col2.name AS [referenced_column]
190
- FROM sys.foreign_key_columns fkc
191
- INNER JOIN sys.objects obj
211
+ FROM sys.foreign_key_columns fkc {{ information_schema_hints() }}
212
+ INNER JOIN sys.objects obj {{ information_schema_hints() }}
192
213
  ON obj.object_id = fkc.constraint_object_id
193
- INNER JOIN sys.tables tab1
214
+ INNER JOIN sys.tables tab1 {{ information_schema_hints() }}
194
215
  ON tab1.object_id = fkc.parent_object_id
195
- INNER JOIN sys.schemas sch
216
+ INNER JOIN sys.schemas sch {{ information_schema_hints() }}
196
217
  ON tab1.schema_id = sch.schema_id
197
- INNER JOIN sys.columns col1
218
+ INNER JOIN sys.columns col1 {{ information_schema_hints() }}
198
219
  ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
199
- INNER JOIN sys.tables tab2
220
+ INNER JOIN sys.tables tab2 {{ information_schema_hints() }}
200
221
  ON tab2.object_id = fkc.referenced_object_id
201
- INNER JOIN sys.columns col2
222
+ INNER JOIN sys.columns col2 {{ information_schema_hints() }}
202
223
  ON col2.column_id = referenced_column_id AND col2.object_id = tab2.object_id
203
224
  WHERE sch.name = '{{ relation.schema }}' and tab2.name = '{{ relation.identifier }}'
204
225
  {% endcall %}
205
226
  {% set references = load_result('find_references')['data'] %}
206
227
  {% for reference in references -%}
207
228
  {% call statement('main') -%}
208
- alter table [{{reference[1]}}].[{{reference[2]}}] drop constraint [{{reference[0]}}]
229
+ alter table {{ adapter.quote(reference[1]) }}.{{ adapter.quote(reference[2]) }} drop constraint {{ adapter.quote(reference[0]) }}
209
230
  {%- endcall %}
210
231
  {% endfor %}
211
232
  {% endmacro %}
@@ -216,28 +237,28 @@
216
237
  SELECT i.name AS index_name
217
238
  , i.name + '__dbt_backup' as index_new_name
218
239
  , COL_NAME(ic.object_id,ic.column_id) AS column_name
219
- FROM sys.indexes AS i
220
- INNER JOIN sys.index_columns AS ic
240
+ FROM sys.indexes AS i {{ information_schema_hints() }}
241
+ INNER JOIN sys.index_columns AS ic {{ information_schema_hints() }}
221
242
  ON i.object_id = ic.object_id AND i.index_id = ic.index_id and i.type <> 5
222
- WHERE i.object_id = OBJECT_ID('{{ relation.schema }}.{{ relation.identifier }}')
243
+ WHERE i.object_id = OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}')
223
244
 
224
245
  UNION ALL
225
246
 
226
247
  SELECT obj.name AS index_name
227
248
  , obj.name + '__dbt_backup' as index_new_name
228
249
  , col1.name AS column_name
229
- FROM sys.foreign_key_columns fkc
230
- INNER JOIN sys.objects obj
250
+ FROM sys.foreign_key_columns fkc {{ information_schema_hints() }}
251
+ INNER JOIN sys.objects obj {{ information_schema_hints() }}
231
252
  ON obj.object_id = fkc.constraint_object_id
232
- INNER JOIN sys.tables tab1
253
+ INNER JOIN sys.tables tab1 {{ information_schema_hints() }}
233
254
  ON tab1.object_id = fkc.parent_object_id
234
- INNER JOIN sys.schemas sch
255
+ INNER JOIN sys.schemas sch {{ information_schema_hints() }}
235
256
  ON tab1.schema_id = sch.schema_id
236
- INNER JOIN sys.columns col1
257
+ INNER JOIN sys.columns col1 {{ information_schema_hints() }}
237
258
  ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
238
- INNER JOIN sys.tables tab2
259
+ INNER JOIN sys.tables tab2 {{ information_schema_hints() }}
239
260
  ON tab2.object_id = fkc.referenced_object_id
240
- INNER JOIN sys.columns col2
261
+ INNER JOIN sys.columns col2 {{ information_schema_hints() }}
241
262
  ON col2.column_id = referenced_column_id AND col2.object_id = tab2.object_id
242
263
  WHERE sch.name = '{{ relation.schema }}' and tab1.name = '{{ relation.identifier }}'
243
264
 
@@ -273,21 +294,21 @@
273
294
  and object_id = OBJECT_ID('{{ relation }}')
274
295
  )
275
296
  begin
276
- {# key columns: bracket-quoted (with ]] escaping) plus per-column direction #}
297
+ {# key columns: quoted (adapter.quote escapes embedded quotes) plus per-column direction #}
277
298
  {%- set key_columns = [] -%}
278
299
  {%- for column in index_config.columns -%}
279
300
  {%- do key_columns.append(
280
- '[' ~ column | replace(']', ']]') ~ ']'
301
+ adapter.quote(column)
281
302
  ~ (' desc' if column in index_config.descending_columns else '')
282
303
  ) -%}
283
304
  {%- endfor -%}
284
305
  {%- set include_columns = [] -%}
285
306
  {%- for column in index_config.included_columns -%}
286
- {%- do include_columns.append('[' ~ column | replace(']', ']]') ~ ']') -%}
307
+ {%- do include_columns.append(adapter.quote(column)) -%}
287
308
  {%- endfor %}
288
309
  create
289
310
  {% if index_config.unique -%} unique {% endif %}{{ index_config.type }}
290
- index [{{ index_name }}]
311
+ index {{ adapter.quote(index_name) }}
291
312
  on {{ relation }}
292
313
  ({{ key_columns | join(', ') }})
293
314
  {% if include_columns -%}
@@ -426,7 +447,7 @@
426
447
  from sys.partitions p {{ information_schema_hints() }}
427
448
  where p.object_id = i.object_id and p.index_id = i.index_id
428
449
  ) part
429
- where i.object_id = OBJECT_ID('{{ relation.schema }}.{{ relation.identifier }}')
450
+ where i.object_id = OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}')
430
451
  and i.index_id > 0
431
452
  and i.[type] not in (3, 4, 7) /* xml, spatial, memory-optimized hash */
432
453
  {%- endcall %}
@@ -435,7 +456,7 @@
435
456
 
436
457
 
437
458
  {% macro sqlserver__get_drop_index_sql(relation, index_name) -%}
438
- drop index [{{ index_name }}] on {{ relation }}
459
+ drop index {{ adapter.quote(index_name) }} on {{ relation }}
439
460
  {%- endmacro %}
440
461
 
441
462
 
@@ -109,7 +109,7 @@
109
109
  {% endmacro %}
110
110
 
111
111
  {%- macro sqlserver__get_use_database_sql(database) -%}
112
- USE [{{database | replace('"', '')}}];
112
+ USE {{ adapter.quote(database | replace('"', '')) }};
113
113
  {%- endmacro -%}
114
114
 
115
115
  {% macro sqlserver__list_schemas(database) %}
@@ -194,8 +194,8 @@
194
194
  , s.name as [schema]
195
195
  , o.modify_date as last_modified
196
196
  , current_timestamp as snapshotted_at
197
- from sys.objects o
198
- inner join sys.schemas s on o.schema_id = s.schema_id and [type] = 'U'
197
+ from sys.objects o {{ information_schema_hints() }}
198
+ inner join sys.schemas s {{ information_schema_hints() }} on o.schema_id = s.schema_id and [type] = 'U'
199
199
  where (
200
200
  {%- for relation in relations -%}
201
201
  (upper(s.name) = upper('{{ relation.schema }}') and
@@ -8,15 +8,21 @@
8
8
 
9
9
  {% macro sqlserver__get_drop_sql(relation) -%}
10
10
  {% if relation.type == 'view' -%}
11
- {% call statement('find_references', fetch_result=true) %}
11
+ {#- auto_begin=false, matching dbt-adapters' own relations/drop.sql: a
12
+ read-only lookup must not open the ambient transaction. This is the
13
+ first statement of the temp-relation build (create.sql ->
14
+ adapter.drop_relation), so with the default auto_begin=True it held
15
+ that build's sys.sysschobjs X locks until the materialization
16
+ committed, deadlocking a concurrent worker (error 1205). -#}
17
+ {% call statement('find_references', fetch_result=true, auto_begin=false) %}
12
18
  {{ get_use_database_sql(relation.database) }}
13
19
  select
14
20
  sch.name as schema_name,
15
21
  obj.name as view_name
16
- from sys.sql_expression_dependencies refs
17
- inner join sys.objects obj
22
+ from sys.sql_expression_dependencies refs {{ information_schema_hints() }}
23
+ inner join sys.objects obj {{ information_schema_hints() }}
18
24
  on refs.referencing_id = obj.object_id
19
- inner join sys.schemas sch
25
+ inner join sys.schemas sch {{ information_schema_hints() }}
20
26
  on obj.schema_id = sch.schema_id
21
27
  where refs.referenced_database_name = '{{ relation.database }}'
22
28
  and refs.referenced_schema_name = '{{ relation.schema }}'
@@ -44,7 +50,8 @@
44
50
  {% macro sqlserver__rename_relation(from_relation, to_relation) -%}
45
51
  {% call statement('rename_relation') -%}
46
52
  {{ get_use_database_sql(from_relation.database) }}
47
- EXEC sp_rename '{{ from_relation.schema }}.{{ from_relation.identifier }}', '{{ to_relation.identifier }}'
53
+ {#- @objname takes a quoted, qualified name; @newname must stay bare -#}
54
+ EXEC sp_rename '{{ escape_single_quotes(from_relation.include(database=False)) }}', '{{ escape_single_quotes(to_relation.identifier) }}'
48
55
  {%- endcall %}
49
56
  {% endmacro %}
50
57
 
@@ -1,9 +1,9 @@
1
1
  {% macro sqlserver__create_schema(relation) -%}
2
2
  {% call statement('create_schema') -%}
3
- USE [{{ relation.database }}];
3
+ {{ get_use_database_sql(relation.database) }}
4
4
  IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = '{{ relation.schema }}')
5
5
  BEGIN
6
- EXEC('CREATE SCHEMA [{{ relation.schema }}]')
6
+ EXEC('CREATE SCHEMA {{ adapter.quote(relation.schema) }}')
7
7
  END
8
8
  {% endcall %}
9
9
  {% endmacro %}
@@ -13,7 +13,7 @@
13
13
  {{ get_use_database_sql(relation.database) }}
14
14
  IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = '{{ relation.schema }}')
15
15
  BEGIN
16
- EXEC('CREATE SCHEMA [{{ relation.schema }}] AUTHORIZATION [{{ schema_authorization }}]')
16
+ EXEC('CREATE SCHEMA {{ adapter.quote(relation.schema) }} AUTHORIZATION {{ adapter.quote(schema_authorization) }}')
17
17
  END
18
18
  {% endcall %}
19
19
  {% endmacro %}
@@ -5,7 +5,11 @@
5
5
  {% if not adapter.behavior.dbt_sqlserver_use_dbt_transactions %}
6
6
  if @@trancount > 0 commit; -- post hooks after fictitious transaction work as expected
7
7
  {% else %}
8
- commit; -- align transaction=False hook behavior with dbt-core transaction semantics.
8
+ {#- guarded, not a bare COMMIT: nothing guarantees a transaction is
9
+ open here. A bare one appeared safe only because some earlier
10
+ statement had auto-begun one (find_references, until relation.sql
11
+ stopped doing that); with @@TRANCOUNT = 0 it raises Msg 3902. -#}
12
+ if @@trancount > 0 commit; -- align transaction=False hook behavior with dbt-core transaction semantics.
9
13
  {% endif %}
10
14
  {% endcall %}
11
15
  {% endif %}
@@ -31,6 +31,10 @@
31
31
 
32
32
  {% set to_drop = [] %}
33
33
  {% set prebuilt_handled = false %}
34
+ {#- true only where the statement('main') batch below carries create_table_as
35
+ DDL, i.e. the fresh-create / full-refresh branches. The incremental
36
+ branch's strategy DML stays transactional, so it leaves this false. -#}
37
+ {% set build_sql_is_create_table_as = false %}
34
38
 
35
39
  {% if existing_relation is none %}
36
40
  {% if config.get('full_refresh_build', 'heap_then_index') == 'prebuilt' %}
@@ -43,6 +47,7 @@
43
47
  {% set prebuilt_handled = true %}
44
48
  {% else %}
45
49
  {% set build_sql = get_create_table_as_sql(False, target_relation, sql) %}
50
+ {% set build_sql_is_create_table_as = true %}
46
51
  {% endif %}
47
52
  {% elif full_refresh_mode %}
48
53
  {#- the target is marked as having a full refresh in flight (blocking
@@ -69,6 +74,7 @@
69
74
  {% set prebuilt_handled = true %}
70
75
  {% else %}
71
76
  {% set build_sql = get_create_table_as_sql(False, intermediate_relation, sql) %}
77
+ {% set build_sql_is_create_table_as = true %}
72
78
  {% if existing_relation.type == 'table' %}
73
79
  {% do sqlserver__mark_full_refresh_incomplete(existing_relation) %}
74
80
  {% endif %}
@@ -82,6 +88,14 @@
82
88
  {% do sqlserver__assert_no_incomplete_full_refresh(existing_relation) %}
83
89
  {% endif %}
84
90
 
91
+ {#- The temp build is all catalog DDL (CREATE OR ALTER VIEW / SELECT *
92
+ INTO / DROP VIEW) and must not share the ambient transaction with the
93
+ strategy DML: held to commit, its sysschobjs X keylocks deadlock a
94
+ second worker. Nothing opens a transaction here - run_query never
95
+ auto-begins, and find_references (relation.sql) no longer does either -
96
+ so each statement autocommits and drops its catalog locks as it
97
+ finishes. The strategy DML below still runs transactionally, via
98
+ statement('main')'s default auto_begin through to adapter.commit(). -#}
85
99
  {% do run_query(get_create_table_as_sql(True, temp_relation, sql)) %}
86
100
 
87
101
  {% set contract_config = config.get('contract') %}
@@ -109,9 +123,28 @@
109
123
  {% endif %}
110
124
 
111
125
  {% if not prebuilt_handled %}
112
- {% call statement("main") %}
113
- {{ build_sql }}
114
- {% endcall %}
126
+ {% if build_sql_is_create_table_as %}
127
+ {#- Same reason as the temp build above: this batch is create_table_as
128
+ catalog DDL, so letting statement() open the ambient transaction
129
+ would hold its sysschobjs X keylocks until adapter.commit() and
130
+ deadlock a second worker. -#}
131
+ {% call statement("main", auto_begin=False) %}
132
+ {{ build_sql }}
133
+ {% endcall %}
134
+ {% else %}
135
+ {% call statement("main") %}
136
+ {{ build_sql }}
137
+ {% endcall %}
138
+ {% endif %}
139
+ {% if build_sql_is_create_table_as %}
140
+ {#- Reopen the ambient transaction the batch above declined to start,
141
+ so the swap and the tail (grants/persist_docs/masks/indexes/
142
+ post-hooks) keep their semantics and adapter.commit() below has a
143
+ matching BEGIN rather than raising Msg 3902. No-op when the flag is
144
+ off. -#}
145
+ {% do adapter.commit_if_open() %}
146
+ {% do adapter.begin_if_closed() %}
147
+ {% endif %}
115
148
  {% endif %}
116
149
 
117
150
  {% if need_swap %}
@@ -37,7 +37,7 @@
37
37
 
38
38
  {% set listColumns %}
39
39
  {% for column in model['columns'] %}
40
- {{ "["~column~"]" }}{{ ", " if not loop.last }}
40
+ {{ adapter.quote(column) }}{{ ", " if not loop.last }}
41
41
  {% endfor %}
42
42
  {%endset%}
43
43
 
@@ -1,14 +1,15 @@
1
1
  {% macro sqlserver__get_test_sql(main_sql, fail_calc, warn_if, error_if, limit) -%}
2
2
 
3
3
  -- Create target schema if it does not
4
- USE [{{ target.database }}];
4
+ {{ get_use_database_sql(target.database) }}
5
5
  IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = '{{ target.schema }}')
6
6
  BEGIN
7
- EXEC('CREATE SCHEMA [{{ target.schema }}]')
7
+ EXEC('CREATE SCHEMA {{ adapter.quote(target.schema) }}')
8
8
  END
9
9
 
10
+ {% set testview_name = "testview_" ~ local_md5(main_sql) ~ "_" ~ (range(1300, 19000) | random) %}
10
11
  {% set testview %}
11
- [{{ target.schema }}].[testview_{{ local_md5(main_sql) }}_{{ range(1300, 19000) | random }}]
12
+ {{ adapter.quote(target.schema) }}.{{ adapter.quote(testview_name) }}
12
13
  {% endset %}
13
14
 
14
15
  {% set sql = main_sql.replace("'", "''")%}
@@ -1,19 +1,21 @@
1
1
  {% macro sqlserver__get_unit_test_sql(main_sql, expected_fixture_sql, expected_column_names) -%}
2
2
 
3
- USE [{{ target.database }}];
3
+ {{ get_use_database_sql(target.database) }}
4
4
  IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = '{{ target.schema }}')
5
5
  BEGIN
6
- EXEC('CREATE SCHEMA [{{ target.schema }}]')
6
+ EXEC('CREATE SCHEMA {{ adapter.quote(target.schema) }}')
7
7
  END
8
8
 
9
+ {% set test_view_name = "testview_" ~ local_md5(main_sql) ~ "_" ~ (range(1300, 19000) | random) %}
9
10
  {% set test_view %}
10
- [{{ target.schema }}].[testview_{{ local_md5(main_sql) }}_{{ range(1300, 19000) | random }}]
11
+ {{ adapter.quote(target.schema) }}.{{ adapter.quote(test_view_name) }}
11
12
  {% endset %}
12
13
  {% set test_sql = main_sql.replace("'", "''")%}
13
14
  EXEC('create view {{test_view}} as {{ test_sql }};')
14
15
 
16
+ {% set expected_view_name = "expectedview_" ~ local_md5(expected_fixture_sql) ~ "_" ~ (range(1300, 19000) | random) %}
15
17
  {% set expected_view %}
16
- [{{ target.schema }}].[expectedview_{{ local_md5(expected_fixture_sql) }}_{{ range(1300, 19000) | random }}]
18
+ {{ adapter.quote(target.schema) }}.{{ adapter.quote(expected_view_name) }}
17
19
  {% endset %}
18
20
  {% set expected_sql = expected_fixture_sql.replace("'", "''")%}
19
21
  EXEC('create view {{expected_view}} as {{ expected_sql }};')
@@ -9,8 +9,21 @@
9
9
  {%- endif -%}
10
10
  {%- set tmp_relation = relation.incorporate(path={"identifier": relation.identifier ~ '__dbt_tmp_vw'}, type='view') -%}
11
11
 
12
+ {#- Now that the incremental temp build commits standalone (see
13
+ incremental.sql), a crash can leave a throwaway table behind and the
14
+ SELECT * INTO below would hit Msg 2714. Drop it first, but only for
15
+ adapter-generated throwaways: `temporary` covers the incremental
16
+ __dbt_temp build, the suffix covers the full-refresh / table-refresh
17
+ __dbt_tmp intermediate. Suffix match is exact, never substring, so a
18
+ user model named stg__dbt_tmp_x is untouched.
19
+ Never guard a fresh-create of the real target: dbt has decided that
20
+ table does not exist, so 2714 must still surface rather than silently
21
+ destroying an object dbt does not know about. -#}
22
+ {%- set _ident = relation.identifier -%}
23
+ {%- set build_into_temp = temporary or _ident.endswith('__dbt_tmp') or _ident.endswith('__dbt_tmp_vw') -%}
24
+
12
25
  {%- do adapter.drop_relation(tmp_relation) -%}
13
- USE [{{ relation.database }}];
26
+ {{ get_use_database_sql(relation.database) }}
14
27
  {{ get_create_view_as_sql(tmp_relation, sql) }}
15
28
 
16
29
  {%- set table_name -%}
@@ -26,13 +39,17 @@
26
39
  {{ build_columns_constraints(relation) }}
27
40
  {% set listColumns %}
28
41
  {% for column in model['columns'] %}
29
- {{ "["~column~"]" }}{{ ", " if not loop.last }}
42
+ {{ adapter.quote(column) }}{{ ", " if not loop.last }}
30
43
  {% endfor %}
31
44
  {%endset%}
32
45
  INSERT INTO {{relation}} WITH (TABLOCK) ({{listColumns}})
33
46
  SELECT {{listColumns}} FROM {{tmp_relation}} {{ query_label }}
34
47
 
35
48
  {% else %}
49
+ {%- if build_into_temp -%}
50
+ IF OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}', 'U') IS NOT NULL
51
+ EXEC('DROP TABLE {{ relation }}');
52
+ {%- endif -%}
36
53
  SELECT * INTO {{ table_name }} FROM {{ tmp_relation }} {{ query_label }}
37
54
  {% endif %}
38
55
  {%- endset -%}
@@ -103,7 +120,7 @@
103
120
  later failure during the load would roll the marker back right along
104
121
  with it, defeating the point. -#}
105
122
  {%- set setup_sql -%}
106
- USE [{{ relation.database }}];
123
+ {{ get_use_database_sql(relation.database) }}
107
124
  {{ get_create_view_as_sql(tmp_relation, sql) }}
108
125
 
109
126
  {#- drop any physical target before the bare CREATE / SELECT ... INTO
@@ -111,7 +128,7 @@
111
128
  dbt's relation cache being stale (reporting none while the table
112
129
  exists) - which would otherwise collide with Msg 2714 (object
113
130
  already exists) -#}
114
- IF OBJECT_ID('{{ escape_single_quotes(relation.schema) }}.{{ escape_single_quotes(relation.identifier) }}', 'U') IS NOT NULL
131
+ IF OBJECT_ID('{{ escape_single_quotes(relation.include(database=False)) }}', 'U') IS NOT NULL
115
132
  EXEC('DROP TABLE {{ relation }}');
116
133
 
117
134
  {% if contract_enforced %}
@@ -152,7 +169,7 @@
152
169
  {%- if contract_enforced -%}
153
170
  {%- set listColumns -%}
154
171
  {%- for column in model['columns'] -%}
155
- {{ "["~column~"]" }}{{ ", " if not loop.last }}
172
+ {{ adapter.quote(column) }}{{ ", " if not loop.last }}
156
173
  {%- endfor -%}
157
174
  {%- endset -%}
158
175
  {%- set insert_statement -%}
@@ -24,7 +24,7 @@
24
24
  CREATE OR ALTER VIEW {{ relation.include(database=False) }} AS {{ sql }};
25
25
  {% endset %}
26
26
 
27
- USE [{{ relation.database }}];
27
+ {{ get_use_database_sql(relation.database) }}
28
28
  EXEC('{{- escape_single_quotes(query) -}}')
29
29
 
30
30
  {% endmacro %}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dbt-sqlserver
3
- Version: 1.12.0rc1
3
+ Version: 1.12.0rc2
4
4
  Summary: A Microsoft SQL Server adapter plugin for dbt
5
5
  Author: Mikael Ene, Anders Swanson, Sam Debruyn, Cor Zuurmond, Cody Scott
6
6
  License: MIT
@@ -1 +0,0 @@
1
- version = "1.12.0rc1"