【问题标题】:TSQL Find MIN/MAX LEN ColName over many tablesTSQL 在许多表中查找 MIN/MAX LEN ColName
【发布时间】:2013-05-01 17:44:42
【问题描述】:

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

这会找到 MAX(如果 Col_1 在 Table1 中):

SELECT MAX(LEN(Col_1)) FROM Table1

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

【问题讨论】:

  • 这样做的目的是什么?你能解释一下这个场景吗?
  • 希望重新创建一个所有列都定义为 varchar(MAX) 的数据库。在新数据库中做同样的事情是不现实的,因为它将几乎呈指数增长。不想在覆盖中丢失数据,所以我需要每个表的每个列名的最大长度。

标签: sql-server max maxlength


【解决方案1】:

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

【讨论】:

  • 我试了一下,结果表中没有行。问题可能是数据类型?它们各不相同:int、bit、numeric、varchar、nvarchar 和最糟糕的“ntext”。我用所有表名、列名、数据类型和“MaxLen”列构建了另一个临时表。我什至无法更新:我试过了
  • 对不起...我试过了:UPDATE p SET p.MAX_LEN = MAX(LEN(CAST(FieldName AS nvarchar(MAX)))) FROM TempFieldNamesTable p
  • 我不太擅长这个......但我得到一个汇总错误。我打算手动做,但实际上有 > 20 个表和 > 700 个字段名称。
  • 正如我在代码中评论的那样,此示例仅查看varchar(max) 列,因此如果您有其他要求,则需要修改脚本。您是否阅读并理解了代码?您是否检查了PRINT 语句显示的 SQL 语句?还有像 intnumeric have fixed storage sizes 这样的数据类型。
  • 对不起 - 我只是没有那么先进。我尝试注释掉 WHERE 子句,但没有帮助。
猜你喜欢
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2021-01-23
相关资源
最近更新 更多