Skip to main content

Executing a Query (Async)

The Snowflake SDK supports asynchronous query execution. This comparison shows how much simpler this becomes with Promise-based code.

Two examples demonstrate different async patterns, both based on Snowflake SDK documentation.

First Example: Basic Async Execution

Without this library: Complex manual Promise wrapping, callback coordination, query ID management, and manual result streaming.

With this library: Execute the query and await the results.

Second Example: Async with Status Polling

Without this library: Manual Promise wrapping, callback coordination, and complex polling setup.

With this library: Execute with async option, await statement readiness, then implement clean polling.

Examples

Example 1

tip
  • Click "WITHOUT Helper Library" to see the original code
  • Click "WITH Helper Library" to see the improved code using this library

Based on an example from the Snowflake documentation.

// Not using the Promise Helper Library

let queryId;

// 1. Manually wrap execution to capture query ID
await new Promise((resolve) => {
connection.execute({
sqlText: "CALL SYSTEM$WAIT(3, 'SECONDS')",
asyncExec: true,
complete: function (err, stmt, rows) {
if (err) {
console.error("Query failed:", err);
return;
}
queryId = stmt.getQueryId();
resolve();
},
});
});

// 2. Manually get results and set up streaming
const statement = await connection.getResultsFromQueryId({ queryId: queryId });
await new Promise((resolve, reject) => {
const stream = statement.streamRows();
stream.on("error", function (err) {
reject(err);
});
stream.on("data", function (row) {
console.log(row);
});
stream.on("end", function () {
resolve();
});
});

Example 2

tip
  • Click "WITHOUT Helper Library" to see the original code
  • Click "WITH Helper Library" to see the improved code using this library

Based on an example from the Snowflake documentation.

// Not using the Promise Helper Library

let queryId;

// 1. Manually wrap execution to capture query ID
await new Promise((resolve, reject) => {
const statement = connection.execute({
sqlText: "CALL SYSTEM$WAIT(3, 'SECONDS')",
asyncExec: true,
complete: function (err, stmt, rows) {
if (err) {
reject(err);
return;
}
queryId = stmt.getQueryId();
resolve();
},
});
});

// 2. Manual polling with setTimeout Promise wrapper
const seconds = 2;
let status = await connection.getQueryStatus(queryId);
while (connection.isStillRunning(status)) {
console.log(`Query status is ${status}, waiting ${seconds} seconds`);

await new Promise((resolve) => {
setTimeout(() => resolve(), 1000 * seconds);
});

status = await connection.getQueryStatus(queryId);
}

console.log(`Query has finished executing, status is ${status}`);