私はそのアイデアの友人ではありませんが、これはあなたが望むことをするはずです:
DECLARE @SQL_STMT VARCHAR(MAX) = ''
SELECT
IDENTITY(int,1,1) as ID, -- for later update
'ALTER TABLE '
+ c.TABLE_NAME
+ ' ALTER COLUMN '
+ c.COLUMN_NAME
+ ' '
+ c.DATA_TYPE
+ '(' P1
, ' MAX(LEN('
+ c.COLUMN_NAME
+ ')'
+') FROM '
+ c.TABLE_NAME P2
, ') ' P3
into #tmp
FROM INFORMATION_SCHEMA.Tables t
JOIN INFORMATION_SCHEMA.Columns c
on c.TABLE_CATALOG= t.TABLE_CATALOG
and c.TABLE_SCHEMA=t.TABLE_SCHEMA
and c.TABLE_NAME=t.TABLE_NAME
where TABLE_TYPE='BASE TABLE' -- only Tables not views
and DATA_TYPE = 'varchar'
Select @SQL_STMT='' -- collect ID + Max info e.g. SELECT 1, MAX(LEN(FirstName)) FROM user_info
Select @SQL_STMT=@SQL_STMT + 'SELECT '+ CAST(ID as varchar(10)) + ', '+ P2 +CHAR(13)
from #tmp
Declare @a table (ID Integer,Size Integer) -- table for ID and Len
--print @SQL_STMT
insert into @a Exec (@SQL_STMT) -- fill table by executing block
-- define a minimum size if 0
Update #tmp set P2 = Case When Size<1 then 1 else Size end -- update p2
From @a a where a.ID = #tmp.ID
Select @SQL_STMT=''
Select @SQL_STMT=@SQL_STMT + P1 + P2 + P3 +CHAR(13)
from #Tmp
print @SQL_STMT
Exec(@SQL_STMT)
Drop table #tmp