指定したテーブルの各列に格納されている実データ長を一覧するクエリです。
実データ長はmax(len())で取得していますので、intとかはintのサイズ(=4)が出力されます。
declare @SCHEMA_NAME nvarchar(100)='<調べたいテーブルのスキーマ名>'
declare @TABLE_NAME nvarchar(100)='<調べたいテーブルの名前>'
declare @COLUMNS table(
COLUMN_NAME nvarchar(100)
)
insert into @COLUMNS
SELECT
col.name
from sys.tables as tab
inner join sys.columns as col on tab.object_id=col.object_id
where
tab.name=@TABLE_NAME
order BY
col.column_id
declare cur CURSOR for select * from @COLUMNS;
open cur;
declare @column_name nvarchar(100);
declare @SQL2 nvarchar(max);
IF OBJECT_ID(N'tempdb..#COLUMN_LENGTH_DATA', N'U') IS NOT NULL
begin
drop table #COLUMN_LENGTH_DATA;
end
create table #COLUMN_LENGTH_DATA(
column_name nvarchar(100),
data_length int
)
fetch next from cur into @column_name;
WHILE @@FETCH_STATUS=0
BEGIN
set @sql2='
insert into #COLUMN_LENGTH_DATA
select
''' + @column_name + ''' as column_name,
max(len([' + @column_name + '])) as data_length
from ' + @SCHEMA_NAME + '.'+ @TABLE_NAME + '
'
exec sp_sqlexec @sql2
fetch next from cur into @column_name;
END
close cur;
DEALLOCATE cur;
select * from #COLUMN_LENGTH_DATA;
--resource cleanup
IF OBJECT_ID(N'tempdb..#COLUMN_LENGTH_DATA', N'U') IS NOT NULL
begin
drop table #COLUMN_LENGTH_DATA;
end