I'd personally create a loop with dynamic SQL which gets executed as it is ran. The code below creates a temp table which is utilized for the loop which will iterate through each table listed in the temp table based on a calculated row number. The dynamic SQL is then set and executed.
Once you make the necessary changes, putting in your database name, column name, data type, and default value and you are satisfied with the results that get printed, you can un-comment the EXECUTE(@SQL)
and re-run the script and it will add the new column to all your tables.
USE [INSERT DATABASE NAME HERE]
GO
IF OBJECT_ID(N'tempdb..#TempSysTableNames') IS NOT NULL
BEGIN
DROP TABLE #TempSysTableNames
END;
DECLARE @ColumnName VARCHAR(250) = 'INSERT COLUMN NAME HERE'
,@DataType VARCHAR(250) = 'INSERT DATA TYPE HERE'
,@DefaultValue VARCHAR(250) = 'INSERT DEFAULT VALUE HERE'
,@SQL VARCHAR(8000)
,@MaxRowNum INT
,@I INT = 1;
SELECT '[' + DB_NAME() + '].[' + OBJECT_SCHEMA_NAME([object_id],DB_ID()) + '].[' + name + ']' AS [name]
,ROW_NUMBER() OVER (ORDER BY [create_date]) AS RowNum
INTO #TempSysTableNames
FROM sys.tables
WHERE [type] = 'U';
SET @MaxRowNum = (SELECT MAX(RowNum)
FROM #TempSysTableNames);
WHILE (@I <= @MaxRowNum)
BEGIN
SET @SQL = (SELECT 'ALTER TABLE ' + [name] + ' ADD ' + @ColumnName + ' ' + @DataType + ' NOT NULL DEFAULT ' + @DefaultValue + ';'
FROM #TempSysTableNames
WHERE RowNum = @I);
PRINT(@SQL);
--EXECUTE(@SQL);
SET @I += 1;
END;