In my opinion the first problem is that you're using varchar for numeric data. You should always use native types like bigint or float or similar when storing data.
The limit of 30 numbers comes from your conversion
CAST(PrivilegeID AS NUMERIC(30, 0))
You could try with
CAST(PrivilegeID AS FLOAT(53))
However I would suggest modifying the underlying data types.
Concerning the fact that the field is 150 characters long and named as an ID, why make the conversion to number at all. If the purpose is to identify something you don't need to calculate with it.
If you need to have a unique ID and the number of records is large, I would suggest using another kind of approach than just simple numbers. For example you could use a GUID as an identifier.