What This Table Is
The sys_dictionary table is ServiceNow's complete field metadata registry. Every field on every table—from incident.short_description to custom fields on your application tables—has exactly one row here. It stores field types, labels, default values, reference qualifiers, and every other piece of schema information.
This table is owned by the Platform module and serves as the foundation for all schema introspection. When you right-click a field and choose "Configure Dictionary", you're editing this table. When the platform validates field types or builds form layouts, it reads from here.
The sys_dictionary table doesn't extend any parent table—it's a standalone system table. However, it's intimately connected to sys_db_object (table definitions) and sys_glide_object (field metadata extensions). The relationship is: one table has many fields, one field has one dictionary entry.
In large enterprise instances, expect 50,000+ records here. That includes every field on every table, including inactive tables and fields. Queries against this table are generally fast—the platform indexes it heavily since schema lookups happen constantly—but avoid wildcard searches on element field names without table filtering.
When You'll Script Against This Table
You'll primarily script against sys_dictionary in Script Includes for platform utilities, Business Rules that need field validation, and background scripts during data migrations. The most common pattern is checking whether fields exist before trying to use them programmatically. You'll also query it in Transform Maps when building dynamic field mappings.
Access requires the admin role for write operations, but most users can read dictionary entries for tables they can access. Scoped apps can only see dictionary entries for their own tables unless explicitly granted cross-scope access.
- Field existence validation before dynamic queries
- Building dynamic form layouts or field lists
- Data migration scripts that need field type information
- Integration utilities that inspect target table schemas
- Custom field documentation or schema export tools
- Reference qualifier builders that need related table information
- Platform upgrade scripts validating custom field compatibility
Table Gotchas
The `name` field combines table and field: it's 'incident.short_description', not just 'short_description'. Always filter by both `name` and `element` or you'll get unexpected results across table inheritance.
Table extension inheritance isn't visible here directly. A field on the `task` table appears in dictionary entries for `incident`, `problem`, etc. Check the `sys_db_object` table for inheritance chains.
- The
activefield only marks the dictionary entry as inactive, not the actual database column. Inactive fields still exist in the database and can still be queried. - Reference fields store their target table in
reference, but choice fields store their choice list in the same field. Checkinternal_typeto distinguish field types properly. - The
column_labelfield is translatable and may show different values based on user language. For consistent scripting, useelement(the actual field name) instead.
Queries without table filtering perform poorly. Always include `name LIKE 'your_table.%'` or filter by the full `name` field. Wildcard searches on `element` alone will timeout on large instances.
- Calculated fields and client-side computed values won't have meaningful
default_valueentries. The business logic lives elsewhere (Script Fields, UI Policies, etc.).
Enjoying this? Get one deep-dive per week.
Join 1,000+ ServiceNow pros — scripts, GlideRecord patterns, Flow Designer techniques, and career moves. Free.
Related Tables
The sys_db_object table is the natural partner—it defines tables while sys_dictionary defines their fields. When building schema documentation or migration tools, you'll query both together to get complete table definitions. The sys_dictionary.name field contains the table name from sys_db_object.
You'll frequently cross-reference with sys_choice when working with choice fields—the dictionary entry tells you it's a choice field, but sys_choice contains the actual choice values. Similarly, sys_glide_object extends dictionary entries with additional field behaviors like attributes and advanced configurations.
For reference fields, you'll often need to join with the target tables themselves. When a dictionary entry shows reference=sys_user, you might then query sys_user to understand what values are available for that reference field. This pattern is common when building dynamic UI components or integration mappings.