Sql server TSQL在多个表上查找最小/最大LEN ColName

Sql server TSQL在多个表上查找最小/最大LEN ColName,sql-server,max,maxlength,Sql Server,Max,Maxlength,我需要找到许多表中列中所有响应的最大长度。其中有些列名在表之间匹配,有些则不匹配。如果它们匹配,我需要在匹配的所有表中使用列名。因此,假设有10个表,总共有200个不同的列名。我创建了一个TempCol表。我还有临时表中的所有表名。我的想法是为Table1MAX、Table1MIN、Table2MAX、Table2MIN等的TempCol表添加col 这将找到最大值(如果Col_1在表1中): 我想用上面的值填充TempCol表,但我一直遇到麻烦。 有人有什么想法吗?这里有一种方法,只适用于最大

我需要找到许多表中列中所有响应的最大长度。其中有些列名在表之间匹配,有些则不匹配。如果它们匹配,我需要在匹配的所有表中使用列名。因此,假设有10个表,总共有200个不同的列名。我创建了一个TempCol表。我还有临时表中的所有表名。我的想法是为Table1MAX、Table1MIN、Table2MAX、Table2MIN等的TempCol表添加col

这将找到最大值(如果Col_1在表1中):

我想用上面的值填充TempCol表,但我一直遇到麻烦。
有人有什么想法吗?

这里有一种方法,只适用于最大长度;您可以将其用作起点,并对其进行修改/扩展,以在结果表中包含更多信息:

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

这样做的目的是什么?你能解释一下这个场景吗?想重新创建一个所有列都被定义为varchar(MAX)的数据库。在新数据库中执行同样的操作是不现实的,因为它将以几乎指数级的速度增长。我不想在转换中丢失数据,所以我需要每个表的每个列名称的maxlength。我尝试了一下,结果表中没有行。一个问题可能是数据类型?它们各不相同:int、bit、numeric、varchar、nvarchar和最糟糕的“ntext”。我用所有的表名、列名、数据类型和一个“MaxLen”列构建了另一个临时表。我甚至无法更新:我已经尝试过了…我尝试过:从TempFieldNamesTable pI更新p SET p.MAX_LEN=MAX(LEN(CAST(FieldName AS nvarchar(MAX)))))我不太擅长这个。。。但我得到了一个聚合错误。我准备手工操作,但实际上有>20个表和>700个字段名。正如我在代码中所评论的,这个示例只查看
varchar(max)
列,因此如果您有其他要求,则需要修改脚本。您是否阅读并理解代码?您是否检查了
PRINT
语句显示的SQL语句?还有像
int
numeric
之类的数据类型。对不起,我只是没那么高级。我试着注释WHERE子句,但没有用。
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