These are what I use: the first script is for tables, the second one - for indexes:
WITH old_columns AS(SELECT t.name as table_name,
t.max_column_id_used,
c.name as column_name,
c.column_id,
c.system_type_id,
c.max_length
FROM OLD_DB.sys.columns c
JOIN OLD_DB.sys.tables t
ON t.object_id = c.object_id
WHERE t.type_desc = 'USER_TABLE'
AND t.type = 'U'),
new_columns AS(SELECT t.name as table_name,
t.max_column_id_used,
c.name as column_name,
c.column_id,
c.system_type_id,
c.max_length
FROM NEW_DB.sys.columns c
JOIN NEW_DB.sys.tables t
ON t.object_id = c.object_id
WHERE t.type_desc = 'USER_TABLE'
AND t.type = 'U')
SELECT *
FROM new_columns g
WHERE NOT EXISTS (SELECT 1
FROM old_columns b
WHERE b.table_name = g.table_name
AND b.column_name= g.column_name);
WITH old_indexes AS (
SELECT tab.name AS table_name,
idx.name AS index_name,
idx.index_id,
idx.type AS index_type,
idx.type_desc AS index_type_desc,
idx.is_unique,
idx.is_unique_constraint,
idx.fill_factor,
idx.allow_row_locks,
idx.allow_page_locks
FROM OLD_DB.sys.indexes idx
JOIN OLD_DB.sys.tables tab
ON tab.object_id = idx.object_id
WHERE tab.type_desc = 'USER_TABLE'
AND tab.type = 'U'
AND idx.name IS NOT NULL),
new_indexes AS (
SELECT tab.name AS table_name,
idx.name AS index_name,
idx.index_id,
idx.type AS index_type,
idx.type_desc AS index_type_desc,
idx.is_unique,
idx.is_unique_constraint,
idx.fill_factor,
idx.allow_row_locks,
idx.allow_page_locks
FROM NEW_DB.sys.indexes idx
JOIN NEW_DB.sys.tables tab
ON tab.object_id = idx.object_id
WHERE tab.type_desc = 'USER_TABLE'
AND tab.type = 'U'
AND idx.name IS NOT NULL)
SELECT mbs.*
FROM new_indexes mbs
WHERE NOT EXISTS (SELECT 1
FROM old_indexes el
WHERE el.table_name = mbs.table_name
AND el.index_name = mbs.index_name
AND el.index_type = mbs.index_type
AND el.index_type_desc = mbs.index_type_desc
AND el.is_unique = mbs.is_unique
AND el.is_unique_constraint = mbs.is_unique_constraint
AND el.fill_factor = mbs.fill_factor);