为了完整起见,我将添加原来是我的解决方案的内容。它以 swasheck 的解决方案为原型,因此他的回答得到了充分肯定,这个解决方案有点混乱,但它应该作为任何其他可能遇到此问题的人的基础:
DECLARE @TableName nvarchar(100) = 'TableToAnalyze' -- Change to your table name
declare @SQLStat nvarchar(4000)
declare @ColName nvarchar(100)
declare @MaxLength integer
declare @MaxUsedLength integer
declare @AvgUsedLength float
declare @StdDev float
declare @parm1IN nvarchar(100)
declare @parm2IN integer
declare @parm3IN integer
declare @parm4IN float
declare @parm5IN float
declare @parm1O integer
declare @parm2O float
declare @parm3O float
CREATE TABLE #Details (
ColumnName nvarchar(100) NULL,
MaxLength integer null,
MaxUsedLength integer null,
AvgUsedLength float null,
StdDev float null
)
declare c cursor for
select c.name, c.max_length
from sys.columns c
join sys.tables t
on c.object_id = t.object_id
where t.name = @TableName
and c.user_type_id = 167
DECLARE @ParmDefinition1 NVARCHAR(500)
SET @ParmDefinition1 = N'@parm1IN nvarchar(100),
@parm1O int OUTPUT,
@parm2O float OUTPUT,
@parm3O float OUTPUT'
DECLARE @ParmDefinition2 NVARCHAR(500)
SET @ParmDefinition2 = N'@parm1IN nvarchar(100),
@parm2IN int,
@parm3IN int,
@parm4IN float,
@parm5IN float'
open c
fetch next from c into
@ColName, @MaxLength
while @@FETCH_STATUS = 0
begin
set @SQLStat = N'SELECT @parm1O = MAX(LEN('+ QUOTENAME(@ColName) + ')),
@parm2O = AVG(LEN('+ QUOTENAME(@ColName) + ')),
@parm3O = STDEV(LEN('+ QUOTENAME(@ColName) + '))
FROM ' + QUOTENAME(@TableName)
EXECUTE sp_executesql @SQLStat, @ParmDefinition1,
@parm1IN = @ColName,
@parm1O = @MaxUsedLength OUTPUT,
@parm2O = @AvgUsedLength OUTPUT,
@parm3O = @StdDev OUTPUT
set @SQLStat = 'INSERT INTO #Details ( ColumnName, MaxLength, MaxUsedLength, AvgUsedLength, StdDev)'
+ ' VALUES(@parm1IN, @parm2IN, @parm3IN, @parm4IN, @parm5IN)'
EXECUTE sp_executesql @SQLStat, @ParmDefinition2,
@parm1IN = @ColName,
@parm2IN = @MaxLength,
@parm3IN = @MaxUsedLength,
@parm4IN = @AvgUsedLength,
@parm5IN = @StdDev
fetch next from c
into @ColName, @MaxLength
end
close c
deallocate c
SELECT * FROM #Details
DROP TABLE #Details