- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎11-09-2016 11:22 PM
Hi..Is there any possible way to get columns names for each table by using java script?
Thanks,
Sujitha nagaraju
Solved! Go to Solution.
- Labels:
-
Scripting and Coding
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎11-09-2016 11:32 PM
For instance... here goes an example for the sys_user table:
Code
var grSysDic = new GlideRecord('sys_dictionary');
grSysDic.addQuery('name','sys_user');
grSysDic.query();
while (grSysDic.next()){
gs.print(' Table Name: ' + grSysDic.name + ' Column Name: ' + element + ' Column Label: ' + column_label );
}
Output
*** Script: Table Name: sys_user Column Name: Column Label:
*** Script: Table Name: sys_user Column Name: accumulated_roles Column Label: Accumulated roles
*** Script: Table Name: sys_user Column Name: active Column Label: Active
*** Script: Table Name: sys_user Column Name: agent_status Column Label: Work agent status
*** Script: Table Name: sys_user Column Name: building Column Label: Building
*** Script: Table Name: sys_user Column Name: calendar_integration Column Label: Calendar integration
*** Script: Table Name: sys_user Column Name: city Column Label: City
*** Script: Table Name: sys_user Column Name: company Column Label: Company
*** Script: Table Name: sys_user Column Name: cost_center Column Label: Cost center
*** Script: Table Name: sys_user Column Name: country Column Label: Country code
*** Script: Table Name: sys_user Column Name: date_format Column Label: Date format
*** Script: Table Name: sys_user Column Name: default_perspective Column Label: Default perspective
*** Script: Table Name: sys_user Column Name: department Column Label: Department
*** Script: Table Name: sys_user Column Name: edu_status Column Label: EDU Status
*** Script: Table Name: sys_user Column Name: email Column Label: Email
*** Script: Table Name: sys_user Column Name: employee_number Column Label: Employee number
*** Script: Table Name: sys_user Column Name: failed_attempts Column Label: Failed login attempts
*** Script: Table Name: sys_user Column Name: first_name Column Label: First name
*** Script: Table Name: sys_user Column Name: gender Column Label: Gender
*** Script: Table Name: sys_user Column Name: geolocation_tracked Column Label: Geolocation tracked
*** Script: Table Name: sys_user Column Name: home_phone Column Label: Home phone
*** Script: Table Name: sys_user Column Name: internal_integration_user Column Label: Internal Integration User
*** Script: Table Name: sys_user Column Name: introduction Column Label: Prefix
*** Script: Table Name: sys_user Column Name: last_login Column Label: Last login
*** Script: Table Name: sys_user Column Name: last_login_device Column Label: Last login device
*** Script: Table Name: sys_user Column Name: last_login_time Column Label: Last login time
*** Script: Table Name: sys_user Column Name: last_name Column Label: Last name
*** Script: Table Name: sys_user Column Name: last_password Column Label: Last password
*** Script: Table Name: sys_user Column Name: last_position_update Column Label: Last position update
*** Script: Table Name: sys_user Column Name: latitude Column Label: Latitude
*** Script: Table Name: sys_user Column Name: ldap_server Column Label: LDAP server
*** Script: Table Name: sys_user Column Name: location Column Label: Location
*** Script: Table Name: sys_user Column Name: locked_out Column Label: Locked out
*** Script: Table Name: sys_user Column Name: longitude Column Label: Longitude
*** Script: Table Name: sys_user Column Name: manager Column Label: Manager
*** Script: Table Name: sys_user Column Name: middle_name Column Label: Middle name
*** Script: Table Name: sys_user Column Name: mobile_phone Column Label: Mobile phone
*** Script: Table Name: sys_user Column Name: name Column Label: Name
*** Script: Table Name: sys_user Column Name: notification Column Label: Notification
*** Script: Table Name: sys_user Column Name: on_schedule Column Label: On schedule
*** Script: Table Name: sys_user Column Name: password_needs_reset Column Label: Password needs reset
*** Script: Table Name: sys_user Column Name: phone Column Label: Business phone
*** Script: Table Name: sys_user Column Name: photo Column Label: Photo
*** Script: Table Name: sys_user Column Name: preferred_language Column Label: Language
*** Script: Table Name: sys_user Column Name: roles Column Label: Roles
*** Script: Table Name: sys_user Column Name: schedule Column Label: Schedule
*** Script: Table Name: sys_user Column Name: source Column Label: Source
*** Script: Table Name: sys_user Column Name: state Column Label: State / Province
*** Script: Table Name: sys_user Column Name: street Column Label: Street
*** Script: Table Name: sys_user Column Name: sys_class_name Column Label: Class
*** Script: Table Name: sys_user Column Name: sys_created_by Column Label: Created by
*** Script: Table Name: sys_user Column Name: sys_created_on Column Label: Created
*** Script: Table Name: sys_user Column Name: sys_domain Column Label: Domain
*** Script: Table Name: sys_user Column Name: sys_domain_path Column Label: Domain Path
*** Script: Table Name: sys_user Column Name: sys_id Column Label: Sys ID
*** Script: Table Name: sys_user Column Name: sys_mod_count Column Label: Updates
*** Script: Table Name: sys_user Column Name: sys_updated_by Column Label: Updated by
*** Script: Table Name: sys_user Column Name: sys_updated_on Column Label: Updated
*** Script: Table Name: sys_user Column Name: time_format Column Label: Time format
*** Script: Table Name: sys_user Column Name: time_zone Column Label: Time zone
*** Script: Table Name: sys_user Column Name: title Column Label: Title
*** Script: Table Name: sys_user Column Name: user_name Column Label: User ID
*** Script: Table Name: sys_user Column Name: user_password Column Label: Password
*** Script: Table Name: sys_user Column Name: vip Column Label: VIP
*** Script: Table Name: sys_user Column Name: web_service_access_only Column Label: Web service access only
*** Script: Table Name: sys_user Column Name: zip Column Label: Zip / Postal code
Thanks,
Berny
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎11-10-2016 07:38 PM
You're welcome Sujitha! sujithanagarajup I'm glad it was of help.
I'll appreciate if you can mark the responses as helpful/correct so that it can be a reference for others looking for the same question.
Thanks,
Berny
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-22-2018 11:41 AM
Thanks Berbny!
Based on your solution I've created a SQL script for generating the MS SQL Server table definition based on the sys_dictionary definition: SQL Code Gist on GitHub
--Language is T-SQL, but there is no option for that syntax here. Use the above GIST link to see the code with correct syntax highlighting.
with sn (tableName, columnName, columnNameUI, max_length, internal_type) as
(
--See https://docs.servicenow.com/bundle/kingston-application-development/page/integrate/odbc-driver/concept/c_ODBCDrvrSQL20082012.html for info on ODBC driver & setting up a linked server
select name, element, column_label, max_length, internal_type
from openquery(SERVICENOW , '
select name
, element --database column name
, column_label --UI name
,CAST(max_length as Decimal(38,0)) max_length --could convert to string here; but this makes it more reusable
,internal_type
from sys_dictionary
where name in (''sys_user'', ''task'') --amend to only output those tables you want; included here since queries can be slow
' )
where element > ''
)
select 'create table ' + tableName + '('
+ stuff((
SELECT char(10) + char(9) + ',' + quotename(columnName) + ' '
+ case internal_type
when 'boolean' then 'bit'
when 'choice' then 'nvarchar(' + cast(max_length as nvarchar) + ')' --just a string
when 'collection' then 'nvarchar(' + cast(max_length as nvarchar) + ')' --just a string
when 'domain_id' then 'nvarchar(32)' --same as GUID
when 'email' then 'nvarchar(' + cast(max_length as nvarchar) + ')' --just a string
when 'float' then 'float'
when 'glide_date' then 'date'
when 'glide_date_time' then 'datetime'
when 'GUID' then 'nvarchar(32)' --'uniqueidentifier' --could hold as uniqueidentifer, but then we'd need to convert values like so when populating: cast(stuff(stuff(stuff(stuff(COLUMN_NAME,21,0,'-'),17,0,'-'),13,0,'-'),9,0,'-') as uniqueidentifier)
when 'integer' then 'int'
when 'multi_two_lines' then 'nvarchar(' + cast(max_length as nvarchar) + ')'
when 'numeric' then 'numeric(38,0)' --not sure if we need to do something special for precision...
when 'password' then 'nvarchar(' + cast(max_length as nvarchar) + ')' --just a string
when 'ph_number' then 'nvarchar(' + cast(max_length as nvarchar) + ')' --just a string
when 'reference' then 'nvarchar(32)' --same as GUID
when 'string' then 'nvarchar(' + cast(max_length as nvarchar) + ')'
when 'sys_class_name' then 'nvarchar(' + cast(max_length as nvarchar) + ')' --just a string
when 'url' then 'nvarchar(' + cast(max_length as nvarchar) + ')' --just a string
when 'user_image' then 'nvarchar(' + cast(max_length as nvarchar) + ')' --just a string
when 'user_roles' then 'nvarchar(' + cast(max_length as nvarchar) + ')' --just a string
else 'nvarchar(max) /* todo: define type mapping for ''' + internal_type + ''' */'
end
+ ' /* ' + replace(columnNameUI,'*/','* /') + ' */ '
from sn c
where c.tableName = t.tableName
FOR XML PATH(''), TYPE
).value('.','varchar(max)'),3,1,' ')
+ '
)'
from sn t
group by t.tableName
Output (e.g. for sys_user table) looks like this:
create table sys_user(
[last_position_update] datetime /* Last position update */
,[on_schedule] nvarchar(40) /* On schedule */
,[latitude] float /* Latitude */
,[sys_class_name] nvarchar(80) /* Class */
,[user_name] nvarchar(80) /* User ID */
,[user_password] nvarchar(100) /* Password */
,[preferred_language] nvarchar(3) /* Language */
,[password_needs_reset] bit /* Password needs reset */
,[country] nvarchar(50) /* Country code */
,[introduction] nvarchar(40) /* Prefix */
,[first_name] nvarchar(50) /* First name */
,[middle_name] nvarchar(50) /* Middle name */
,[last_name] nvarchar(50) /* Last name */
,[name] nvarchar(255) /* Name */
,[phone] nvarchar(40) /* Business phone */
,[mobile_phone] nvarchar(40) /* Mobile phone */
,[home_phone] nvarchar(40) /* Home phone */
,[email] nvarchar(100) /* Email */
,[title] nvarchar(60) /* Title */
,[gender] nvarchar(40) /* Gender */
,[roles] nvarchar(255) /* Roles */
,[time_zone] nvarchar(40) /* Time zone */
,[accumulated_roles] nvarchar(4000) /* Accumulated roles */
,[date_format] nvarchar(40) /* Date format */
,[time_format] nvarchar(40) /* Time format */
,[last_login] date /* Last login */
,[last_login_time] datetime /* Last login time */
,[locked_out] bit /* Locked out */
,[last_password] nvarchar(40) /* Last password */
,[last_login_device] nvarchar(40) /* Last login device */
,[manager] nvarchar(32) /* Manager */
,[notification] int /* Notification */
,[calendar_integration] int /* Calendar integration */
,[default_perspective] nvarchar(32) /* Default perspective */
,[photo] nvarchar(40) /* Photo */
,[location] nvarchar(32) /* Location */
,[department] nvarchar(32) /* Department */
,[edu_status] nvarchar(40) /* EDU Status */
,[company] nvarchar(32) /* Company */
,[source] nvarchar(255) /* Source */
,[street] nvarchar(255) /* Street */
,[city] nvarchar(40) /* City */
,[zip] nvarchar(40) /* Zip / Postal code */
,[state] nvarchar(40) /* State / Province */
,[employee_number] nvarchar(40) /* Employee number */
,[vip] bit /* VIP */
,[building] nvarchar(32) /* Building */
,[active] bit /* Active */
,[failed_attempts] int /* Failed login attempts */
,[cost_center] nvarchar(32) /* Cost center */
,[sys_domain] nvarchar(32) /* Domain */
,[sys_id] nvarchar(32) /* Sys ID */
,[sys_updated_on] datetime /* Updated */
,[sys_updated_by] nvarchar(40) /* Updated by */
,[sys_created_by] nvarchar(40) /* Created by */
,[sys_created_on] datetime /* Created */
,[sys_mod_count] numeric(38,0) /* Updates */
,[ldap_server] nvarchar(32) /* LDAP server */
,[schedule] nvarchar(32) /* Schedule */
,[longitude] float /* Longitude */
,[geolocation_tracked] bit /* Geolocation tracked */
,[sso_source] nvarchar(128) /* SSO Source */
,[web_service_access_only] bit /* Web service access only */
,[internal_integration_user] bit /* Internal Integration User */
,[x_bmgr_support_ent_bomgar_username] nvarchar(80) /* Bomgar Username */
,[u_org_structure] nvarchar(1000) /* Org Structure */
,[agent_status] nvarchar(40) /* Work agent status */
)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-22-2018 07:07 PM
That's interesting! What will be the purpose of reproducing the same table structure in ServiceNow at an external SQL DB?
Thanks,
Berny
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-23-2018 12:31 AM
Hey Berny,
Benefits are:
- Out of system reporting.
- Clearly documented (in code form) SN table definitions.
More info on out-of-system reporting
Our company has a suite of BI tools for generating reports, dashboards, etc.
Whilst SN has functionality to do these things itself:
- our skillset is in our BI suite (i.e. our BI guys don't know glide/javascript)
- if we want to mix in data from other systems we can do this in BI
- we keep a consistent toolset for all reporting needs
That's not to say we don't use SN's abilities; but for anything complex, or anything seen by people who aren't day to day users of SN (e.g. upper management) it makes more sense to go the BI route.
How this logic helps with this reporting
We take nightly copies of the SN data so that our BI queries can run over a local database (i.e. as this is then significantly faster than working over ODBC / web services when dealing with large amounts of data, and allows for more complex queries in a more familiar query language).
Our DBA had been figuring out table definitions by pulling back records of interest, resolving the occasional number precision error (ref: https://docs.servicenow.com/bundle/kingston-application-development/page/integrate/odbc-driver/task/t_ConfiguringSQLServer.html), and when there were truncation errors increasing field lengths. By having those definitions automatically generated it should save a lot of effort for such tasks.
Future Improvements
As I learn more about what info's in SN I may be able to improve this functionality; both in terms of the table definitions and creating the import jobs. i.e. Figure out if columns should be nullable / find out if I can define precision as well as scale for numbers, build in automatic conversion for GUIDs (i.e. so we hold as unique identifiers & convert then on import by adding hyphens and then casting), generate foreign key relationships (again to build self-documenting code and also improve performance for joins). As those improvements come I'll be updating the GIST linked above, so the community can make use of this should they have the need.
Cheers,
JB

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-23-2018 12:42 AM
Nice, what do you need that for?