SQL Server input
Read a table or SQL query from Microsoft SQL Server. A Bookmark can read only the rows added or changed since the last successful run.
What it does
Reads from a Microsoft SQL Server database through a saved Connection and streams the result into the pipeline in batches. Pick a table with the live schema and table browser, or write your own T-SQL when you want the server to filter, join or aggregate before the rows move. Credentials live on the Connection and never enter the pipeline.
Inputs and outputs
| Inputs | None. This node starts a pipeline. |
| Outputs | One. |
When to use it
- Pull a table or query result out of SQL Server
- Push filtering, joins and aggregation down to SQL Server, where they run faster
- Move data out of a line-of-business system into a warehouse or a file
Examples
Pick a table
dbo.Sales
The browser lists the real schemas and tables the connection can see.
Only the rows you need
SELECT id, name, total FROM dbo.Orders WHERE status = 'paid'
Far cheaper than reading the table and filtering on the canvas.
Sample while building
SELECT TOP 100 * FROM dbo.Orders
A quick look at the shape before you commit to the whole table.
Aggregate at the source
SELECT region, SUM(total) FROM dbo.Orders GROUP BY region
Moves a summary out instead of every row.
Only rows newer than the last successful run
Bookmark column: updated_at · Start from: 2026-01-01 00:00:00
Each Live run reads only rows added or changed since the last run that succeeded. After an outage, one run catches up.
Tips
- Press ⤢ beside SQL query for the SQL Studio: a full-screen editor that browses the connection's schemas, tables and columns, shows the columns your query returns without running it, and runs it with Run to here without closing.
- Pre-SQL runs on this same connection immediately before the query, so session settings stick: SET DATEFORMAT ymd, SET LANGUAGE us_english, SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED, or a procedure that prepares the extract. It also runs when you press Test, because a test run really does read from the database, so keep it to session setup.
- The query is T-SQL, the server's own dialect. This is a source query, not a Trinium row expression.
- Columns appear as soon as you pick a table or write a query, with no test run needed. Trinium asks SQL Server to describe the result set, which runs nothing.
- A query WINS whenever both a table and a query are filled in, so clear the query to go back to reading the table.
- Dates, times, datetimes and datetimeoffsets come across as real dates, so you can sort, filter and do date math on them straight away. guid and decimal arrive as exact text; retype a decimal with Manage Columns if you want a fixed one. CONVERT(NVARCHAR(MAX), …) anything else exotic.
- A query that returns no rows still passes its columns downstream, so a Union or Join below it keeps working.
- Pick a Connection first; add one on the Connections page if the list is empty.
- How the connection reaches the server (plain, preferred or verified TLS) is set on the Connection, not here.
- Bookmark: each Live run reads only the rows whose bookmark column is past where the last SUCCESSFUL run stopped. A failed or cancelled run never moves it, so after an outage one run reads everything that was missed. Staging and Production keep their own; a Test run always reads from Start from and never moves it.
- The bookmark column must move forward whenever a row is added or changed: an updated_at stamp, or an ever-increasing id. A row whose bookmark column is empty is never read, and a row DELETED in the database is never seen, so reload the table now and then if deletes matter.
- With a hand-written query, write WHERE updated_at >= ${bookmark} where the value goes. Editing the table, query, connection or column keeps the bookmark, and the run's Messages say when it last read something else. A Bookmark column of another kind (a date where it was a number) is refused until you Set or Reset it in the node's Bookmark panel.
- Each value of a text parameter the pipeline uses keeps its own bookmark, so region = EU and region = US each read only their own new rows. A number or true/false parameter in the table name is refused, because one bookmark would serve every value; make it a text parameter with a list of choices. A date in the table name (events_${date:%Y%m%d}) carries the bookmark into each new day's table, so bookmark a date-time column there.
- When the pipeline uses a text parameter anywhere, such as ${region} in this query or in a Filter after it, each value keeps its own bookmark, so a run for one region never moves another's. A value's first run reads from Start from, and date, number and true/false parameters share one bookmark. Starting or stopping using a text parameter pauses the bookmark the same way, until you Set where the value starts or Reset the old bookmark.
- Lookback (date-time columns only) re-reads the N minutes before where the last successful run stopped, to catch rows a long transaction committed late. A first run and every Test run read exactly from Start from. Re-read rows load again, so use it with an Upsert output.