1. A trigger should be written to allow multiple inserts.
2. You can check like this
IF exists(select 'x' from inserted where DATALENGTH(sys_cde)<>1)
3. But it makes no sence, the table inserted is a temporary system view of the table test and it can store only 1 char. The error is returned before and instead of the trigger.
If your column sys_cde is declared char(1), then ispaleny is right. The data is truncated from the very beginig in inserted table (inserted has the same columns as the original table for which you're trying to declare a triger)
But now if you column accepts more than one character, you have two problems.
First of all, In the way you constructed your triger, it will only work if you insert one row at a time (it will not function for multiple inserts -> for multiple inserts use ispaleny solution).
The second problem, even if you want this to work with one row insertion at a time, you decalred variable @sys_cde as char(1), so the next line:
SELECT @sys_cde = sys_cde from inserted
will truncate the value of sys_cde field to a single char (that's all that @sys_cde var can handle), and this is where your problem came from.
Even if SQL wouldn't throw you an error, the trigger will not work, because lenght of @sys_cde is always 1, so your condition:
will always return FALSE, and log error code will never triger.