apache/seatunnel · error · SeaTunnelRuntimeException
COMMON-17
COMMON-17
Error message
'${identifier}' unsupported convert type '${dataType}' of '${field}' to SeaTunnel data type. What it means
SqlServerTypeConverter.convert() maps a SQL Server column type string to a SeaTunnel data type when reading. Type strings with no case in the switch (unmapped SQL Server types) hit default and throw CommonError.convertToSeaTunnelTypeError. The source cannot represent that column in the SeaTunnel type system.
Source
Thrown at seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/sqlserver/SqlServerTypeConverter.java:304
case SQLSERVER_DATETIME2:
builder.sourceType(
String.format("%s(%s)", SQLSERVER_DATETIME2, typeDefine.getScale()));
builder.dataType(LocalTimeType.LOCAL_DATE_TIME_TYPE);
builder.scale(typeDefine.getScale());
break;
case SQLSERVER_DATETIMEOFFSET:
// DATETIMEOFFSET is LTZ (includes timezone offset)
builder.sourceType(
String.format("%s(%s)", SQLSERVER_DATETIMEOFFSET, typeDefine.getScale()));
builder.dataType(LocalTimeType.OFFSET_DATE_TIME_TYPE);
builder.scale(typeDefine.getScale());
break;
case SQLSERVER_SMALLDATETIME:
builder.sourceType(SQLSERVER_SMALLDATETIME);
builder.dataType(LocalTimeType.LOCAL_DATE_TIME_TYPE);
break;
default:
throw CommonError.convertToSeaTunnelTypeError(
DatabaseIdentifier.SQLSERVER, sqlServerType, typeDefine.getName());
}
return builder.build();
}
@Override
public BasicTypeDefine reconvert(Column column) {
BasicTypeDefine.BasicTypeDefineBuilder builder =
BasicTypeDefine.builder()
.name(column.getName())
.nullable(column.isNullable())
.comment(column.getComment())
.defaultValue(column.getDefaultValue());
switch (column.getDataType().getSqlType()) {
case BOOLEAN:
builder.columnType(SQLSERVER_BIT);
builder.dataType(SQLSERVER_BIT);
break;View on GitHub (pinned to cf67b549a7)
Solutions
- Cast the column in the source query, e.g. SELECT CAST(geo AS NVARCHAR(MAX)) AS geo FROM t.
- Create a view excluding/casting unsupported columns and read from it.
- Select only supported columns in the connector's query.
- Add a converter case for the type (e.g. map GEOGRAPHY to STRING) if appropriate, and contribute upstream.
Example fix
// before: SELECT * FROM places (has GEOGRAPHY col) // after SELECT id, CONVERT(NVARCHAR(MAX), geo) AS geo_str FROM places
Defensive patterns
Strategy: validation
Validate before calling
-- Find unsupported SQL Server columns before reading
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable'
AND DATA_TYPE IN ('hierarchyid','geography','geometry','sql_variant','sysname','table','timestamp'); Try / catch
try {
sourceReader.read();
} catch (SeaTunnelRuntimeException e) {
if (e.getMessage().contains("unsupported convert type")) {
// rewrite query with CONVERT(NVARCHAR(MAX), col) for the named column
} else { throw e; }
} Prevention
- Avoid spatial/hierarchyid/sql_variant columns in tables used as SeaTunnel sources.
- Expose ETL-friendly views with CAST/CONVERT for legacy tables.
- Check INFORMATION_SCHEMA.COLUMNS during pipeline onboarding.
- Use explicit column lists instead of SELECT *.
When it happens
Trigger: Reading a SQL Server table containing a column type not handled by the converter, e.g. HIERARCHYID, GEOGRAPHY, GEOMETRY, SQL_VARIANT, SYSNAME, or TABLE type in the metadata.
Common situations: Legacy SQL Server schemas using spatial or hierarchyid columns; sql_variant columns populated via generic CDC or catalog metadata reads; type names changed across SQL Server versions.
Related errors
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/d51a775178e10f6f.
Report an issue: GitHub.