Skip to content

Unexpected decimal scale loading from SQL Server to Snowflake #720

@TimPossiblee

Description

@TimPossiblee

Sling version:

1.5.12

What is the Operating System?

Linux

Do you have a CLI Pro/Platform subscription?

No

Description of the issue

When loading data from SQL Server to Snowflake using Sling, decimal columns appear to be created by default as decimal(24,6) or larger, even when the source column explicitly defines a smaller scale (e.g., decimal(10,2)).
Based on the the metadata available by the source database, I would expect Sling to preserve the exact precision and scale from the source types where possible.
I found that extending the sling run with explicit column_typing delivers a somewhat more expected DDL.

Running the first command with sling v1.3.4 resulted also in a different DLL:

create table "SLING_TEST"."ALL_DTYPES_MSSQL" ("COL_MONEY" decimal(24,6),
"COL_DECIMAL" decimal(10,2),
"COL_DECIMAL2" decimal(28,8),
"COL_DECIMAL3" decimal(16,8),
"_SLING_LOADED_AT" timestamp_tz)

Replication Configuration

sling run -d \
    --src-conn test_mssql \
    --src-stream 'select convert(money, 1234.56) as col_money, convert(decimal(10, 2), 1234.56) as col_decimal, convert(decimal(28, 8), 1234.12345678) as col_decimal2, convert(decimal(16, 8), 1234.56) as col_decimal3' \
    --tgt-conn snowflake \
    --tgt-object 'sling_test.all_dtypes_mssql' \
    --tgt-options '{"column_casing": "target"}' \
    --mode full-refresh
sling run -d \
    --src-conn test_mssql \
    --src-stream 'select convert(money, 1234.56) as col_money, convert(decimal(10, 2), 1234.56) as col_decimal, convert(decimal(28, 8), 1234.12345678) as col_decimal2, convert(decimal(16, 8), 1234.56) as col_decimal3' \
    --tgt-conn snowflake \
    --tgt-object 'sling_test.all_dtypes_mssql' \
    --tgt-options '{"column_casing": "target", "column_typing": {"decimal": {"min_precision": 1, "min_scale": 0}}}' \
    --mode full-refresh

Log Output

Log 1

2026-03-16 11:53:59 INF Sling CLI | https://slingdata.io
2026-03-16 11:53:59 DBG Sling version: 1.5.12 (linux amd64)
2026-03-16 11:53:59 DBG type is db-db
2026-03-16 11:53:59 DBG using: {"columns":null,"mode":"full-refresh","select":null,"transforms":null}
2026-03-16 11:53:59 DBG using source options: {"empty_as_null":false,"datetime_format":"AUTO","max_decimals":-1}
2026-03-16 11:53:59 DBG using target options: {"datetime_format":"auto","file_max_rows":0,"max_decimals":-1,"use_bulk":true,"add_new_columns":true,"adjust_column_type":false,"column_casing":"target","table_tmp":"\"SLING_TEST\".\"ALL_DTYPES_MSSQL_TMP\""}
2026-03-16 11:53:59 INF connecting to source database (sqlserver)
2026-03-16 11:53:59 DBG opened "sqlserver" connection (conn-sqlserver-test_mssql-jAC)
2026-03-16 11:53:59 INF connecting to target database (snowflake)
2026-03-16 11:54:00 DBG opened "snowflake" connection (conn-snowflake-snowflake-kP4)
2026-03-16 11:54:00 INF reading from source database
2026-03-16 11:54:00 DBG select convert(money, 1234.56) as col_money, convert(decimal(10, 2), 1234.56) as col_decimal, convert(decimal(28, 8), 1234.12345678) as col_decimal2, convert(decimal(16, 8), 1234.56) as col_decimal3 [test_mssql-jAC]
2026-03-16 11:54:00 DBG applying column casing (target) for target type (snowflake)
2026-03-16 11:54:00 DBG    col_money => COL_MONEY
2026-03-16 11:54:00 DBG    col_decimal => COL_DECIMAL
2026-03-16 11:54:00 DBG    col_decimal2 => COL_DECIMAL2
2026-03-16 11:54:00 DBG    col_decimal3 => COL_DECIMAL3
2026-03-16 11:54:00 INF writing to target database [mode: full-refresh]
2026-03-16 11:54:00 DBG drop table if exists "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" [snowflake-kP4]
2026-03-16 11:54:00 DBG table "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" dropped
2026-03-16 11:54:00 DBG create transient table "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" ("COL_MONEY" decimal(24,6),
  "COL_DECIMAL" decimal(24,6),
  "COL_DECIMAL2" decimal(28,8),
  "COL_DECIMAL3" decimal(26,8),
  "_SLING_LOADED_AT" timestamp_tz) [snowflake-kP4]
2026-03-16 11:54:00 INF created table "SLING_TEST"."ALL_DTYPES_MSSQL_TMP"
2026-03-16 11:54:00 INF streaming data
2026-03-16 11:54:00 DBG CREATE STAGE IF NOT EXISTS "SLING_TEST"."SLING_STAGING" [snowflake-kP4]
2026-03-16 11:54:00 DBG USE SCHEMA SLING_TEST [snowflake-kP4]
2026-03-16 11:54:00 DBG opened "file" connection (conn-file-Qbw)
2026-03-16 11:54:00 DBG writing to file:///home/tim/gitbox/eds-warehouse.git/edwh-2317-sling-upgrade/orchestrate/sling/tmp/0648c13d/snowflake/put/sling_test.all_dtypes_mssql_tmp/2026-03-16T115400.939/part.01 [fileRowLimit=500000 fileBytesLimit=300000000 compression=zstd concurrency=7 useBufferedStream=false fileFormat=csv singleFile=false]
2026-03-16 11:54:00 DBG REMOVE @"SLING_TEST"."SLING_STAGING"/sling_test.all_dtypes_mssql_tmp/2026-03-16T115400.939 [snowflake-kP4]
2026-03-16 11:54:01 DBG PUT 'file:///home/tim/gitbox/eds-warehouse.git/edwh-2317-sling-upgrade/orchestrate/sling/tmp/0648c13d/snowflake/put/sling_test.all_dtypes_mssql_tmp/2026-03-16T115400.939/part.01.0001.csv.zst' @"SLING_TEST"."SLING_STAGING"/sling_test.all_dtypes_mssql_tmp/2026-03-16T115400.939 PARALLEL=8 AUTO_COMPRESS=FALSE [snowflake-kP4]
2026-03-16 11:54:01 DBG COPY INTO "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" ("COL_MONEY", "COL_DECIMAL", "COL_DECIMAL2", "COL_DECIMAL3", "_SLING_LOADED_AT")
from ( 
  select T.$1, T.$2, T.$3, T.$4, T.$5
  from @"SLING_TEST"."SLING_STAGING"/sling_test.all_dtypes_mssql_tmp/2026-03-16T115400.939 as T
)
FILE_FORMAT = (
  TYPE = CSV
  RECORD_DELIMITER = '\n'
  ESCAPE_UNENCLOSED_FIELD = NONE
  FIELD_OPTIONALLY_ENCLOSED_BY = '0x22'
  EMPTY_FIELD_AS_NULL = FALSE
  NULL_IF = '\\N'
  SKIP_HEADER = 1
  REPLACE_INVALID_CHARACTERS = TRUE
)
ON_ERROR = ABORT_STATEMENT [snowflake-kP4]
2026-03-16 11:54:01 DBG 
+------------------------------------------------------------------------------------------+--------+-------------+-------------+
| FILE                                                                                     | STATUS | ROWS_LOADED | ERRORS_SEEN |
+------------------------------------------------------------------------------------------+--------+-------------+-------------+
| sling_staging/sling_test.all_dtypes_mssql_tmp/2026-03-16T115400.939/part.01.0001.csv.zst | LOADED |           1 |           0 |
+------------------------------------------------------------------------------------------+--------+-------------+-------------+
2026-03-16 11:54:01 DBG REMOVE @"SLING_TEST"."SLING_STAGING"/sling_test.all_dtypes_mssql_tmp/2026-03-16T115400.939 [snowflake-kP4]
2026-03-16 11:54:01 DBG select count(*) cnt from "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" [snowflake-kP4]
2026-03-16 11:54:01 DBG drop table if exists "SLING_TEST"."ALL_DTYPES_MSSQL" [snowflake-kP4]
2026-03-16 11:54:02 DBG table "SLING_TEST"."ALL_DTYPES_MSSQL" dropped
2026-03-16 11:54:02 DBG create table "SLING_TEST"."ALL_DTYPES_MSSQL" ("COL_MONEY" decimal(24,6),
  "COL_DECIMAL" decimal(24,6),
  "COL_DECIMAL2" decimal(28,8),
  "COL_DECIMAL3" decimal(26,8),
  "_SLING_LOADED_AT" timestamp_tz) [snowflake-kP4]
2026-03-16 11:54:02 INF created table "SLING_TEST"."ALL_DTYPES_MSSQL"
2026-03-16 11:54:02 DBG insert into "SLING_TEST"."ALL_DTYPES_MSSQL" ("COL_MONEY", "COL_DECIMAL", "COL_DECIMAL2", "COL_DECIMAL3", "_SLING_LOADED_AT") select "COL_MONEY" as "COL_MONEY", "COL_DECIMAL" as "COL_DECIMAL", "COL_DECIMAL2" as "COL_DECIMAL2", "COL_DECIMAL3" as "COL_DECIMAL3", "_SLING_LOADED_AT" as "_SLING_LOADED_AT" from "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" [snowflake-kP4]
2026-03-16 11:54:02 DBG inserted rows into "SLING_TEST"."ALL_DTYPES_MSSQL" from temp table "SLING_TEST"."ALL_DTYPES_MSSQL_TMP"
2026-03-16 11:54:02 INF inserted 1 rows into "SLING_TEST"."ALL_DTYPES_MSSQL" in 2 secs [0 r/s] [77 B]
2026-03-16 11:54:02 DBG drop table if exists "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" [snowflake-kP4]
2026-03-16 11:54:02 DBG table "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" dropped
2026-03-16 11:54:02 DBG closed "snowflake" connection (conn-snowflake-snowflake-kP4)
2026-03-16 11:54:02 DBG closed "sqlserver" connection (conn-sqlserver-test_mssql-jAC)
2026-03-16 11:54:02 INF execution succeeded

Log 2

2026-03-16 11:55:10 INF Sling CLI | https://slingdata.io
2026-03-16 11:55:10 DBG Sling version: 1.5.12 (linux amd64)
2026-03-16 11:55:10 DBG type is db-db
2026-03-16 11:55:10 DBG using: {"columns":null,"mode":"full-refresh","select":null,"transforms":null}
2026-03-16 11:55:10 DBG using source options: {"empty_as_null":false,"datetime_format":"AUTO","max_decimals":-1}
2026-03-16 11:55:10 DBG using target options: {"datetime_format":"auto","file_max_rows":0,"max_decimals":-1,"use_bulk":true,"add_new_columns":true,"adjust_column_type":false,"column_casing":"target","column_typing":{"decimal":{"min_precision":1,"min_scale":0}},"table_tmp":"\"SLING_TEST\".\"ALL_DTYPES_MSSQL_TMP\""}
2026-03-16 11:55:10 INF connecting to source database (sqlserver)
2026-03-16 11:55:10 DBG opened "sqlserver" connection (conn-sqlserver-test_mssql-NiT)
2026-03-16 11:55:10 INF connecting to target database (snowflake)
2026-03-16 11:55:11 DBG opened "snowflake" connection (conn-snowflake-snowflake-dDA)
2026-03-16 11:55:11 INF reading from source database
2026-03-16 11:55:11 DBG select convert(money, 1234.56) as col_money, convert(decimal(10, 2), 1234.56) as col_decimal, convert(decimal(28, 8), 1234.12345678) as col_decimal2, convert(decimal(16, 8), 1234.56) as col_decimal3 [test_mssql-NiT]
2026-03-16 11:55:11 DBG applying column casing (target) for target type (snowflake)
2026-03-16 11:55:11 DBG    col_money => COL_MONEY
2026-03-16 11:55:11 DBG    col_decimal => COL_DECIMAL
2026-03-16 11:55:11 DBG    col_decimal2 => COL_DECIMAL2
2026-03-16 11:55:11 DBG    col_decimal3 => COL_DECIMAL3
2026-03-16 11:55:11 INF writing to target database [mode: full-refresh]
2026-03-16 11:55:11 DBG drop table if exists "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" [snowflake-dDA]
2026-03-16 11:55:11 DBG table "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" dropped
2026-03-16 11:55:11 DBG create transient table "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" ("COL_MONEY" decimal(24,6),
  "COL_DECIMAL" decimal(24,2),
  "COL_DECIMAL2" decimal(28,8),
  "COL_DECIMAL3" decimal(26,8),
  "_SLING_LOADED_AT" timestamp_tz) [snowflake-dDA]
2026-03-16 11:55:11 INF created table "SLING_TEST"."ALL_DTYPES_MSSQL_TMP"
2026-03-16 11:55:11 INF streaming data
2026-03-16 11:55:11 DBG CREATE STAGE IF NOT EXISTS "SLING_TEST"."SLING_STAGING" [snowflake-dDA]
2026-03-16 11:55:11 DBG USE SCHEMA SLING_TEST [snowflake-dDA]
2026-03-16 11:55:11 DBG opened "file" connection (conn-file-old)
2026-03-16 11:55:11 DBG writing to file:///home/tim/gitbox/eds-warehouse.git/edwh-2317-sling-upgrade/orchestrate/sling/tmp/8a1b9fdc/snowflake/put/sling_test.all_dtypes_mssql_tmp/2026-03-16T115511.818/part.01 [fileRowLimit=500000 fileBytesLimit=300000000 compression=zstd concurrency=7 useBufferedStream=false fileFormat=csv singleFile=false]
2026-03-16 11:55:11 DBG REMOVE @"SLING_TEST"."SLING_STAGING"/sling_test.all_dtypes_mssql_tmp/2026-03-16T115511.818 [snowflake-dDA]
2026-03-16 11:55:11 DBG PUT 'file:///home/tim/gitbox/eds-warehouse.git/edwh-2317-sling-upgrade/orchestrate/sling/tmp/8a1b9fdc/snowflake/put/sling_test.all_dtypes_mssql_tmp/2026-03-16T115511.818/part.01.0001.csv.zst' @"SLING_TEST"."SLING_STAGING"/sling_test.all_dtypes_mssql_tmp/2026-03-16T115511.818 PARALLEL=8 AUTO_COMPRESS=FALSE [snowflake-dDA]
2026-03-16 11:55:12 DBG COPY INTO "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" ("COL_MONEY", "COL_DECIMAL", "COL_DECIMAL2", "COL_DECIMAL3", "_SLING_LOADED_AT")
from ( 
  select T.$1, T.$2, T.$3, T.$4, T.$5
  from @"SLING_TEST"."SLING_STAGING"/sling_test.all_dtypes_mssql_tmp/2026-03-16T115511.818 as T
)
FILE_FORMAT = (
  TYPE = CSV
  RECORD_DELIMITER = '\n'
  ESCAPE_UNENCLOSED_FIELD = NONE
  FIELD_OPTIONALLY_ENCLOSED_BY = '0x22'
  EMPTY_FIELD_AS_NULL = FALSE
  NULL_IF = '\\N'
  SKIP_HEADER = 1
  REPLACE_INVALID_CHARACTERS = TRUE
)
ON_ERROR = ABORT_STATEMENT [snowflake-dDA]
2026-03-16 11:55:12 DBG 
+------------------------------------------------------------------------------------------+--------+-------------+-------------+
| FILE                                                                                     | STATUS | ROWS_LOADED | ERRORS_SEEN |
+------------------------------------------------------------------------------------------+--------+-------------+-------------+
| sling_staging/sling_test.all_dtypes_mssql_tmp/2026-03-16T115511.818/part.01.0001.csv.zst | LOADED |           1 |           0 |
+------------------------------------------------------------------------------------------+--------+-------------+-------------+
2026-03-16 11:55:12 DBG REMOVE @"SLING_TEST"."SLING_STAGING"/sling_test.all_dtypes_mssql_tmp/2026-03-16T115511.818 [snowflake-dDA]
2026-03-16 11:55:12 DBG select count(*) cnt from "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" [snowflake-dDA]
2026-03-16 11:55:12 DBG drop table if exists "SLING_TEST"."ALL_DTYPES_MSSQL" [snowflake-dDA]
2026-03-16 11:55:12 DBG table "SLING_TEST"."ALL_DTYPES_MSSQL" dropped
2026-03-16 11:55:13 DBG create table "SLING_TEST"."ALL_DTYPES_MSSQL" ("COL_MONEY" decimal(24,6),
  "COL_DECIMAL" decimal(24,2),
  "COL_DECIMAL2" decimal(28,8),
  "COL_DECIMAL3" decimal(28,8),
  "_SLING_LOADED_AT" timestamp_tz) [snowflake-dDA]
2026-03-16 11:55:13 INF created table "SLING_TEST"."ALL_DTYPES_MSSQL"
2026-03-16 11:55:13 DBG insert into "SLING_TEST"."ALL_DTYPES_MSSQL" ("COL_MONEY", "COL_DECIMAL", "COL_DECIMAL2", "COL_DECIMAL3", "_SLING_LOADED_AT") select "COL_MONEY" as "COL_MONEY", "COL_DECIMAL" as "COL_DECIMAL", "COL_DECIMAL2" as "COL_DECIMAL2", "COL_DECIMAL3" as "COL_DECIMAL3", "_SLING_LOADED_AT" as "_SLING_LOADED_AT" from "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" [snowflake-dDA]
2026-03-16 11:55:13 DBG inserted rows into "SLING_TEST"."ALL_DTYPES_MSSQL" from temp table "SLING_TEST"."ALL_DTYPES_MSSQL_TMP"
2026-03-16 11:55:13 INF inserted 1 rows into "SLING_TEST"."ALL_DTYPES_MSSQL" in 2 secs [0 r/s] [77 B]
2026-03-16 11:55:13 DBG drop table if exists "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" [snowflake-dDA]
2026-03-16 11:55:13 DBG table "SLING_TEST"."ALL_DTYPES_MSSQL_TMP" dropped
2026-03-16 11:55:13 DBG closed "snowflake" connection (conn-snowflake-snowflake-dDA)
2026-03-16 11:55:13 DBG closed "sqlserver" connection (conn-sqlserver-test_mssql-NiT)
2026-03-16 11:55:13 INF execution succeeded

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions