これは、MAX の長さのみの 1 つの方法です。これを出発点として使用し、それを変更/拡張して、結果テーブルにより多くの情報を含めることができます。
create table dbo.Results (
TableName sysname not null,
ColumnName sysname not null,
MaxLength int not null default 0,
primary key (TableName, ColumnName)
)
insert into dbo.Results (TableName, ColumnName)
select object_name(sc.object_id), sc.name
from sys.columns sc
join sys.types st
on sc.system_type_id = st.system_type_id
-- get data for varchar(max) columns only
where st.name = 'varchar' and sc.max_length = -1
declare @TableName sysname, @ColumnName sysname, @sql nvarchar(max)
declare TablesAndColumns cursor local fast_forward
for
select TableName, ColumnName
from dbo.Results
open TablesAndColumns
fetch next from TablesAndColumns into @TableName, @ColumnName
while @@fetch_status = 0
begin
set @sql = 'update dbo.Results set MaxLength = (select isnull(max(len(' + @ColumnName + ')),0) ' +
' from ' + @TableName + ') ' +
' where TableName = ''' + @TableName + ''' and ColumnName = ''' + @ColumnName + ''''
print @sql
exec sp_executesql @sql
fetch next from TablesAndColumns into @TableName, @ColumnName
end
close TablesAndColumns
deallocate TablesAndColumns
select * from dbo.Results
カーソルと動的 SQL を使用することは常に良い考えとは限りませんが、このような 1 回限りのシステム タスクの場合は妥当な方法です。