GlideRecord is the primary API for database operations in ServiceNow. It allows you to query, insert, update, and delete records from database tables.
GlideRecord is the MOST tested topic in CSA and CAD exams. Master query(), next(), getValue(), setValue(), insert(), update(), and deleteRecord().
// Step 1: Create GlideRecord object
var gr = new GlideRecord('incident');
// Step 2: Add query conditions
gr.addQuery('active', true);
gr.addQuery('priority', '1');
// Step 3: Execute query
gr.query();
// Step 4: Loop through results
while (gr.next()) {
// Step 5: Access field values
gs.info('Incident: ' + gr.number + ', Priority: ' + gr.priority);
}
var gr = new GlideRecord('incident');
// Equals
gr.addQuery('state', '2');
// Not equals
gr.addQuery('state', '!=', '7');
// Greater than, less than
gr.addQuery('priority', '<', '3');
gr.addQuery('sys_created_on', '>', '2024-01-01');
// IN operator
gr.addQuery('state', 'IN', '1,2,3');
// LIKE (contains)
gr.addQuery('short_description', 'CONTAINS', 'email');
// STARTSWITH, ENDSWITH
gr.addQuery('number', 'STARTSWITH', 'INC');
// IS EMPTY, IS NOT EMPTY
gr.addQuery('assignment_group', 'ISEMPTY');
gr.addQuery('assigned_to', 'ISNOTEMPTY');
gr.query();
var gr = new GlideRecord('incident');
// OR query - priority 1 OR 2
var qc = gr.addQuery('priority', '1');
qc.addOrCondition('priority', '2');
// Complex OR: (priority=1 OR priority=2) AND state=2
var qc = gr.addQuery('priority', '1');
qc.addOrCondition('priority', '2');
gr.addQuery('state', '2');
gr.query();
while (gr.next()) {
gs.info(gr.number);
}
Always call query() before next(). Limit results with setLimit() for performance. Use addEncodedQuery() for complex queries copied from filter navigator.
var gr = new GlideRecord('incident');
gr.get('sys_id_here');
// Get field value
var priority = gr.getValue('priority'); // Returns string
var state = gr.state.toString(); // Also returns string
// Get reference field sys_id
var assignedToID = gr.getValue('assigned_to');
// Get display value (for reference fields)
var assignedToName = gr.getDisplayValue('assigned_to');
var groupName = gr.assignment_group.getDisplayValue();
// Set field value
gr.setValue('priority', '1');
gr.priority = '2'; // Alternative syntax
// Set reference field
gr.setValue('assigned_to', 'user_sys_id_here');
gr.assigned_to = 'user_sys_id_here';
// Update record
gr.update();
// Create new incident
var gr = new GlideRecord('incident');
gr.initialize(); // Optional but recommended
gr.short_description = 'Network outage in Building A';
gr.category = 'network';
gr.priority = '1';
gr.caller_id = gs.getUserID();
// Insert returns sys_id of new record
var newSysID = gr.insert();
if (newSysID) {
gs.info('Created incident: ' + gr.number);
} else {
gs.error('Failed to create incident');
}
// Update single record by sys_id
var gr = new GlideRecord('incident');
if (gr.get('sys_id_here')) {
gr.state = '2'; // In Progress
gr.assigned_to = gs.getUserID();
gr.update();
}
// Update multiple records
var gr = new GlideRecord('incident');
gr.addQuery('state', '1'); // New
gr.addQuery('priority', '1');
gr.query();
while (gr.next()) {
gr.state = '2';
gr.assignment_group = 'high_priority_group_id';
gr.update(); // Update each record
}
// updateMultiple() - updates all matching records
var gr = new GlideRecord('incident');
gr.addQuery('state', '1');
gr.addQuery('priority', '5');
gr.setValue('state', '7'); // Closed
gr.updateMultiple(); // Updates all at once
Use update() in a loop for complex logic. Use updateMultiple() for simple bulk updates (faster, but doesn't run business rules for each record).
// Delete single record
var gr = new GlideRecord('incident');
if (gr.get('sys_id_here')) {
gr.deleteRecord();
}
// Delete multiple records
var gr = new GlideRecord('incident');
gr.addQuery('state', '7'); // Closed
gr.addQuery('sys_created_on', '<', 'javascript:gs.daysAgo(365)');
gr.query();
while (gr.next()) {
gr.deleteRecord();
}
// deleteMultiple() - deletes all matching records
var gr = new GlideRecord('incident');
gr.addQuery('state', '7');
gr.addQuery('sys_created_on', '<', 'javascript:gs.daysAgo(730)');
gr.deleteMultiple();
var gr = new GlideRecord('incident');
// get() - Query by sys_id, returns boolean
if (gr.get('sys_id_here')) {
// Record found
}
// get(name, value) - Query by any field
if (gr.get('number', 'INC0010001')) {
// Record found
}
// getRowCount() - Count results
gr.addQuery('active', true);
gr.query();
var count = gr.getRowCount();
gs.info('Active incidents: ' + count);
// hasNext() - Check if more records
gr.query();
if (gr.hasNext()) {
// At least one record exists
}
// next() - Move to next record
while (gr.next()) {
// Process each record
}
// setLimit() - Limit results
gr.setLimit(10);
gr.query();
// orderBy() and orderByDesc()
gr.orderBy('priority');
gr.orderByDesc('sys_created_on');
gr.query();
// nil() - Check if field is empty
if (gr.assignment_group.nil()) {
// Field is empty
}
// changes() - Check if field was modified
if (gr.priority.changes()) {
gs.info('Priority changed from ' + gr.priority.getOldValue() +
' to ' + gr.priority.getValue());
}
// changesFrom() and changesTo()
if (gr.state.changesFrom('1').changesTo('2')) {
// State changed from New to In Progress
}
new GlideRecord('table')addQuery(field, value)query() - Executenext() - Loopget(sys_id) - Single recordgetValue()/setValue()insert()/update()/deleteRecord()getRowCount() - Countnil() - Check emptychanges() - Check modified