Нахождение максимальной длины с помощью цикла - PullRequest
0 голосов
/ 28 марта 2020

enter image description here

У меня есть следующий запрос, который возвращает имена таблиц и имен полей из двух столбцов: пример записи образца: таблица = имя поля 'TABLOCTYP' = 'TYPDES', Запрос возвращает записи 206 строк. Мы используем SQL Server 2012.

 SELECT 
   CODFIC_0 AS 'Table',
   ATABZON.CODZONE_0 AS 'Field' 
   FROM LIVE.AMSKZON
          INNER JOIN LIVE.ATABZON ON AMSKZON.CODTYP_0 = ATABZON.CODTYP_0
 WHERE ATABZON.CODTYP_0 ='DES'
 AND CODMSK_0 IS NOT NULL
 GROUP BY CODFIC_0, ATABZON.CODTYP_0
 ORDER BY 1 

Изображение 1 - это результаты моего первого запроса

Я хочу взять эти результаты и передать их через, возможно, табличный параметр, может быть, все oop. Что-то вроде того, что ниже для каждой строки в моей таблице. Я не уверен, как это сделать с мира или сканирования может таблица.

  DECLARE @table        nvarch(15)
  DECLARE @field        nvarch(25)

  sET @table = 'ABATABT'
  SET @field ='NOMABT'
  SELECT MAX(LEN(@field),
  FROM @table 

Моими результатами будут максимальная длина поля в таблице и содержимое поля. Мне нужно знать, какие записи имеют максимальную длину> 12, чтобы я мог очистить их перед импортом в мою новую систему. Поэтому мне нужно отобразить содержимое поля, чтобы знать, что мне нужно очистить.

Я получаю неправильную синхронизацию c возле 'Group By'

 exec ('select  
'''+@tab_name+''','''+@col_name+''',max(len('+@col_name+')),'''+@col_name+''' 
from [xxxx].'+@tab_name+'''Group By'''+@col_name+'''Having 
max(len('+@col_name+'))>12''')

 set @counter -= 1
end

1 Ответ

0 голосов
/ 28 марта 2020

Вы можете использовать Dynami c SQL, чтобы получить подробную информацию о столбцах для каждой пары table_column из YourTable.

попробуйте следующее

drop table if exists #temp
create table dbo.result_tab (TableName varchar(100), FieldName varchar(100), Max_Length int, Max_Value varchar(1000))
select *, ROW_NUMBER() over (order by (select null)) rn into #temp from dbo.YourTable

declare @counter int = (select count(1) from #temp)
declare @tab_name varchar(100)
declare @col_name varchar(100)

while (@counter > 0)
begin
    set @tab_name = (select TableName from #temp where rn = @counter)
    set @col_name = (select FieldName from #temp where rn = @counter)

    print('insert into result_tab select '''+@tab_name+''','''+@col_name+''',max(len('+@col_name+')), null from dbo.'+@tab_name+'')
    exec ('insert into result_tab select '''+@tab_name+''','''+@col_name+''',max(len('+@col_name+')), null from dbo.'+@tab_name+'')
    print('update result_tab set Max_Value = (select top 1 '+@col_name+' from '+@tab_name+' where len('+@col_name+') = (select Max_Length from dbo.result_tab where TableName = '''+@tab_name+''' and FieldName = '''+@col_name+''')) where TableName = '''+@tab_name+''' and FieldName = '''+@col_name+'''')
    exec ('update result_tab set Max_Value = (select top 1 '+@col_name+' from '+@tab_name+' where len('+@col_name+') = (select Max_Length from dbo.result_tab where TableName = '''+@tab_name+''' and FieldName = '''+@col_name+''')) where TableName = '''+@tab_name+''' and FieldName = '''+@col_name+'''')

    set @counter -= 1
end

select * from result_tab

, см. демо здесь . НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...