Pertama lihat beberapa tangkapan layar. masukkan deskripsi gambar di sinimasukkan deskripsi gambar di sini sql sql-server tsql dynamic-sql

-1
Sudip Bhattacharjee 20 November 2020, 12:51

1 menjawab

Jawaban Terbaik

OK... Maaf, tapi ini jawaban yang buruk. Jawaban yang sangat buruk. Ini adalah jenis jawaban ketika Anda membutuhkan perbaikan sekarang, dan tidak punya waktu untuk memperbaiki masalah dengan benar.

Perbaikan sebenarnya adalah mengecualikan baris yang tidak memiliki nilai valid sebelum menggabungkannya ke dalam kumpulan data yang digunakan untuk membuat tabel Anda. Namun, tanpa mengetahui proses/data Anda lebih dekat, saya tidak dapat melakukan ini. Sebagai gantinya, saya memiliki pekerjaan peretasan yang lengkap.

Bagaimanapun, dari apa yang saya tahu

  • Di tabel #TmpZacksCons
  • Anda memiliki beberapa baris di mana semua kolom yang berkaitan dengan tanggal semuanya NULL
  • Dan Anda ingin mengecualikan itu
  • Nama kolom diatur secara dinamis - mereka berada di variabel @PeriodCols

Yang dapat Anda lakukan adalah menghapus baris dari #TmpZacksCons yang memiliki semua NULLS. Masalahnya, tentu saja, kolom-kolom itu dibuat secara dinamis.

Jadi, setelah perintah Anda yang ada

 SET @sql='Insert Into #TmpZacksCons (Section, LineItem,Ord,      
 '+@PeriodCols+'      
 )      
 Select b.Section, b.LineItem,Max(Ord)+1 Ord,      
 '+@AvgSql+'      
  From #TmpAll_Broker_LI b       
  Group By b.Section, b.LineItem'      
 EXEC(@sql) 

Saya menyarankan perintah DELETE untuk menghapus yang semua kolomnya NULL.

PERBARUI

(Versi baru ini berdasarkan pengetahuan yang diperbarui - menurut saya COALESCE tidak dapat mengembalikan NULL)

Pekerjaan peretasan di sini didasarkan pada fakta bahwa kami tidak tahu nama kolom, jadi kami tidak bisa hanya menguji apakah kolom 1 adalah nol, kolom 2 adalah nol, dll. Jadi yang saya lakukan adalah menggunakan COALESCE ekspresi untuk menemukan apakah semua kolom NULL, karena akan mengembalikan nilai non-NULL pertama dalam daftar.

SET @sql='DELETE FROM #TmpZacksCons 
          WHERE COALESCE('+@PeriodCols+',NULL) IS NULL'
EXEC (@sql)

Jika ekspresi COALESCE mengembalikan NULL, itu berarti semua kolom memiliki nilai NULL.

Perhatikan NULL tambahan di COALESCE ada jika daftar kolom hanya memiliki 1 kolom.

VERSI SEBELUMNYA - TIDAK RELEVAN LAGI

Jadi yang saya lakukan adalah membuat 'angka ajaib' yang menyatakan bahwa semua kolom adalah NULL melalui COALESCE ekspresi yang menemukan nilai non-NULL pertama dalam daftar.

Jadi, setelah perintah Anda di atas, saya sarankan

SET @sql='DELETE FROM #TmpZacksCons 
          WHERE COALESCE('+@PeriodCols+',-99999.9999) = -99999.9999'
EXEC (@sql)

Jika semua nilainya NULL, COALESCE akan mengembalikan -99999.9999 yang kemudian memicu penghapusan.

Masalah dengan hal di atas, tentu saja, adalah jika salah satu dari nilai sebenarnya sama dengan angka ajaib -99999.9999, baris tersebut dapat dihapus.

0
seanb 20 November 2020, 23:22