pentaho/pentaho-kettle · error · KettleDatabaseException
JobSQL.NoSQLFileSpecified
JobSQL.NoSQLFileSpecified
Error message
JobSQL.NoSQLFileSpecified
What it means
KettleDatabaseException with localized message JobSQL.NoSQLFileSpecified thrown by JobEntrySQL.buildSqlFromFile when the entry is configured to run SQL from a file (sqlFromFile=true) but the sqlFilename field is null. Nothing was ever specified in the 'SQL from file' filename box.
Solutions
- Open the SQL job entry in Spoon and set the 'SQL from file' filename.
- If filename should come from a variable, ensure it is set at runtime instead of relying on null.
- Or disable 'SQL from file' and supply the SQL directly in the entry's SQL box.
Example fix
// before
jobEntrySQL.setSqlFromFile(true);
jobEntrySQL.setSQL("SELECT 1"); // filename never set -> throws
// after
jobEntrySQL.setSqlFromFile(true);
jobEntrySQL.setSqlFilename("${Internal.Job.Filename.Directory}/init.sql"); Defensive patterns
Strategy: validation
Validate before calling
JobEntrySQL sqlEntry = (JobEntrySQL) jobEntry;
if (sqlEntry.isSQLFromFile() && (sqlEntry.getSqlFilename() == null || sqlEntry.getSqlFilename().trim().isEmpty())) {
throw new KettleException("'SQL from file' enabled but no SQL filename is set");
}
Try / catch
try {
result = sqlEntry.execute(prev, 0);
} catch (KettleDatabaseException e) {
if (e.getMessage() != null && e.getMessage().contains("NoSQLFileSpecified")) {
logError("Configure the SQL filename before running");
}
} Prevention
- Always set the filename when enabling 'SQL from file'
- Add a metadata review step before promoting jobs
- Prefer variables with defaults over empty fields
When it happens
Trigger: Executing a SQL job entry where 'SQL from file' is enabled but the filename field is empty/unset; the guard fires before any file access.
Common situations: User enabled 'Read SQL from file' but forgot to type the filename; entry copied from another job where the filename was cleared; XML/repository load returned null for the filename attribute.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
- ColumnExists.Error.ColumnnameFieldMissing
- ColumnExists.Error.TablenameFieldMissing
- JobSQL.ErrorRunningSQLfromFile
- JobSQL.SQLFileNotExist
- SymmetricCryptoTrans.Exception.MissingMessageField
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/b1d66445a5ada8aa.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/entries/sql/JobEntrySQL.java:273
} else {
db.execStatements( theSql );
}
} catch ( KettleDatabaseException je ) {
result.setNrErrors( 1 );
logError( BaseMessages.getString( PKG, "JobSQL.ErrorRunJobEntry", je.getMessage() ) );
}
} else {
result.setNrErrors( 1 );
logError( BaseMessages.getString( PKG, "JobSQL.NoDatabaseConnection" ) );
}
result.setResult( result.getNrErrors() == 0 );
return result;
}
public String buildSqlFromFile() throws KettleDatabaseException {
if ( sqlFilename == null ) {
throw new KettleDatabaseException( BaseMessages.getString( PKG, "JobSQL.NoSQLFileSpecified" ) );
}
String realFilename = environmentSubstitute( sqlFilename );
try ( FileObject sqlFile = KettleVFS.getInstance( parentJobMeta.getBowl() ).getFileObject( realFilename, this ) ) {
if ( !sqlFile.exists() ) {
logError( BaseMessages.getString( PKG, "JobSQL.SQLFileNotExist", realFilename ) );
throw new KettleDatabaseException( BaseMessages.getString(
PKG, "JobSQL.SQLFileNotExist", realFilename ) );
}
if ( isDetailed() ) {
logDetailed( BaseMessages.getString( PKG, "JobSQL.SQLFileExists", realFilename ) );
}
try ( InputStream inputStream = KettleVFS.getInputStream( sqlFile ) ) {
InputStreamReader bufferedStream = new InputStreamReader( new BufferedInputStream( inputStream, 500 ) );
BufferedReader buff = new BufferedReader( bufferedStream );
String sLine;View on GitHub (pinned to f3058517a1)