For a given table...
SELECT sc.name AS column_name, t.name AS data_type, t.max_length, t.[precision], t.scale
FROM sys.columns sc
INNER JOIN sys.types t ON sc.user_type_id = t.user_type_id
WHERE sc.object_id = OBJECT_ID('AdventureWorks2012.Person.Person')
ORDER BY sc.column_id
This will give you them in the order they are listed in the table. By using user_type you also cover for the possibility of user created data types. The last 3 fields are needed for data types that take extra parameters, eg VARCHAR(200), NUMERIC(12,3). If you see a -1 in the max_length field, then it's probably something like VARCHAR(MAX) or XML.
For multiple tables, it's tricky. You could create a table from your tables (maybe with a SELECT TOP(0) so as to not bother copying the data) and then plug it into the above. However if you have fields with the same name in those tables, then your table will not create. Remember to drop your table afterwards. You could do a temp table but they are trickier to find the object_id for.