enter image description here

Saya memiliki kueri berikut yang mengembalikan dua kolom nama tabel dan nama bidang: sampel catatan sampel: tabel ='TABLOCTYP' nama bidang ='TYPDES', Kueri mengembalikan catatan 206 baris. Kami menggunakan 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 

Gambar satu adalah hasil dari query pertama saya

Saya ingin mengambil hasil ini dan meneruskannya melalui parameter yang mungkin bernilai tabel mungkin satu lingkaran. Sesuatu seperti apa di bawah ini untuk setiap baris di meja saya. Saya tidak yakin bagaimana melakukan from peace atau scan may table.

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

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

Hasil saya akan menjadi panjang bidang maksimal di tabel dan isi bidang. Saya perlu mengetahui catatan mana yang memiliki panjang maksimal >12 sehingga saya dapat membersihkannya sebelum mengimpor ke sistem baru saya. Jadi saya perlu konten bidang ditampilkan untuk mengetahui apa yang perlu saya bersihkan.

Saya mendapatkan Syntec yang Salah di dekat '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
0
JohnF 28 Maret 2020, 06:36

1 menjawab

Jawaban Terbaik

Anda dapat menggunakan SQL dinamis untuk mendapatkan detail kolom untuk setiap pasangan table_column dari YourTable.

Coba yang berikut ini

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

Silakan lihat demo di sini. HTH.

0
sacse 29 Maret 2020, 03:54