TSQL在许多表中查找MIN / MAX LEN ColName

时间:2013-05-01 17:44:43

标签: sql-server max maxlength

我需要为许多表中的列中的所有响应找到MAX LEN。其中一些列名称在表格中匹配,有些则不匹配。如果它们匹配,我需要在它匹配的所有表中使用列名。所以,比方说10个表,共有200个不同的列名。我创建了一个TempCol表。我还在临时表中拥有所有表名。我的想法是在Table1MAX,Table1MIN,Table2MAX,Table2MIN等的TempCol表中添加cols。

这找到MAX(IF Col_1在表1中):

SELECT MAX(LEN(Col_1)) FROM Table1

我想用上面的值填写TempCol表,但我一直在打墙。 有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是一种方法,仅适用于MAX长度;您可以将其用作起点并修改/扩展它以在结果表中包含更多信息:

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并不总是一个好主意,但对于像这样的一次性系统任务来说,这是一种合理的方法。