Here's my take on it the column type generation, which includes computed columns, UDTs and the numeric & decimal types:
[font="Courier New"]
SELECTQUOTENAME(c.name) + ' '
+CASE WHEN c.is_computed = 0 THEN
CASE t.is_user_defined WHEN 1 THEN QUOTENAME(s.name) + '.' ELSE '' END +
QUOTENAME(t.name) +
CASE
WHEN t.name IN ('binary','varbinary','char','varchar')
THEN '(' + CASE c.max_length WHEN -1 THEN 'max' ELSE CAST(c.max_length AS VARCHAR(10)) END + ')'
WHEN t.name IN ('nchar','nvarchar')
THEN '(' + CASE c.max_length WHEN -1 THEN 'max' ELSE CAST(c.max_length/2 AS VARCHAR(10)) END + ')'
WHEN t.name IN('numeric','decimal')
THEN '(' + CAST(c.[precision] AS VARCHAR(10)) + ', ' + CAST(c.[scale] AS VARCHAR(10))+ ')'
ELSE ''
END + CASE c.is_nullable WHEN 0 THEN ' NOT NULL' ELSE ' NULL' END
ELSE ' AS ' + cc.[definition]
END AS dataType
FROMsys.columns c
INNERJOIN sys.objects o
ONc.[object_id] = o.[object_id]
INNERJOIN sys.types t
ONc.system_type_id = t.system_type_id
ANDc.user_type_id = t.user_type_id
LEFTJOIN sys.schemas s
ONt.[schema_id] = s.[schema_id]
LEFTJOIN sys.computed_columns cc
ONc.[object_id] = cc.[object_id]
ANDc.column_id = cc.column_id
WHEREo.name = 'Table_1'
ORDERBY c.column_id
[/font]