0

多くのテーブルにまたがる列のすべての応答の MAX LEN を見つける必要があります。これらの列名には、テーブル全体で一致するものと一致しないものがあります。それらが一致する場合、一致するすべてのテーブルで列名を使用する必要があります。たとえば、合計 200 の異なる列名を持つ 10 のテーブルがあるとします。TempCol テーブルを作成しました。また、一時テーブルにすべてのテーブル名があります。私の考えは、Table1MAX、Table1MIN、Table2MAX、Table2MIN などの TempCol テーブルに列を追加することです。

これにより、MAX が検出されます (Col_1 が Table1 にある場合)。

SELECT MAX(LEN(Col_1)) FROM Table1

上記の値を TempCol テーブルに入力したいのですが、壁にぶつかり続けています。誰にもアイデアはありますか?

4

1 に答える 1

0

これは、MAX の長さのみの 1 つの方法です。これを出発点として使用し、それを変更/拡張して、結果テーブルにより多くの情報を含めることができます。

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 を使用することは常に良い考えとは限りませんが、このような 1 回限りのシステム タスクの場合は妥当な方法です。

于 2013-05-01T19:44:24.700 に答える