İçinde 130'dan fazla sütun bulunan bir tablo var (bunu yapmadım - ben yapmadım). Her bir sütunu açıkça listelemeden her boş satırı (her alan boş) bu tablodan kaldırmamız gerekiyor. İdeal olarak, dinamik SQL kullanan ve herhangi bir tabloya uygulanabilecek bir çözüm istiyorum. Bunu nasıl yapabilirim?Herhangi bir SQL tablosundan her boş satırı nasıl kaldırılır
cevap
Bu en azından bir yolu var parçası alacak: QUOTENAME
kullanımı tuhaf adlandırılmış sütunlar işlemek için
DECLARE @myTable VARCHAR(MAX)
SET @MyTable = 'myTable'
DECLARE @SQL VARCHAR(MAX)
SELECT @SQL = COALESCE(@SQL + ' AND ','')+ '(' +quotename(COLUMN_NAME) + ' = '''' OR ' +quotename(COLUMN_NAME) + ' IS NULL)'
FROM information_schema.columns
WHERE table_NAME = @myTable
SET @SQL = 'DELETE FROM ' + quotename(@myTable) + ' WHERE ' + @sql
select @sql
Not. Ayrıca, tüm sütunların dize sütunları olduğunu varsayar (veya bir dizeye dolaylı olarak dönüştürülebilir). Çözümünüzde, bazı veri tiplerini (örneğin, CASE kullanarak) farklı veri tiplerini işlemek için isteyebilirsiniz.
SELECT @SQL = COALESCE(@SQL + ' AND ','')+ '(' +quotename(COLUMN_NAME) + ' = ' + CASE WHEN data_type = 'int' then '0' when data_type = 'varchar' then '''' else '''' end + ' OR ' +quotename(COLUMN_NAME) + ' IS NULL)'
FROM information_schema.columns
WHERE table_NAME = @myTable
Ben senin tablolar, sütunlar, anahtarlar ve benzeri hakkında bilgi içeren INFORMATION_SCHEMA
görünümleri bir göz alarak ele alacak. TABLES
ve COLUMNS
görünümlerini kullanmak, bunun için oldukça sağlam bir çözüm bulmanızı sağlayacaktır. İşte MSDN documentation.
DECLARE @SQL VARCHAR(MAX)
SELECT @SQL = COALESCE(@SQL + ' AND ','') +
(CASE
WHEN UPPER(DATA_TYPE) = 'INT' THEN ('(' +quotename(COLUMN_NAME) + ' = 0 OR ' +quotename(COLUMN_NAME) + ' IS NULL)')
WHEN UPPER(DATA_TYPE) = 'VARCHAR' THEN ('(' +quotename(COLUMN_NAME) + ' = '''' OR ' +quotename(COLUMN_NAME) + ' IS NULL)')
-- More conditions are goes here
-- Cover all data type (DATA_TYPE) used at your target table, or you may cover all existing data types
ELSE ''
END)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_NAME = @targetTable
SET @SQL = 'DELETE FROM ' + QUOTENAME(@targetTable) + ' WHERE ' + @sql
SELECT @SQL
Böyle bir şey için görsel sorgu oluşturucuları veya tasarımcıları kullanma eğilimindeyim. Tüm alan isimlerini otomatik olarak koyarlar ve her alan için IS NULL veya = '' öğesini kopyalayıp yapıştırabilir ve doğru sorguyu üretir. Onları SELECT olarak test edip test ettikten sonra, bunları SİL'e veya başka bir sorgu türüne ihtiyaç duyduğuma dönüştürüyorum.
Bu, her sütunun null
olduğu satırları kaldıracaktır.
-- Sample table
declare @T table
(
Col1 int,
Col2 datetime,
Col3 bit,
Col4 nvarchar(max)
)
-- Add sample data
insert into @T values
(null, null, null, null),
( 1, null, null, null),
(null, getdate(), null, null),
(null, null, 1, null),
(null, null, null, '')
-- Delete rows where all column values are null
;with C(XmlCol) as
(
select
(select T.*
for xml path('row'), type)
from @T as T
)
delete from C
where C.XmlCol.exist('row/*') = 0
Sonuç:
Col1 Col2 Col3 Col4
----------- ----------------------- ----- ----------
1 NULL NULL NULL
NULL 2011-11-23 14:09:42.770 NULL NULL
NULL NULL 1 NULL
NULL NULL NULL
http://data.stackexchange.com/stackoverflow/q/118893/
Düzenleme:
bunu şu şekilde görünecektir null
yanı sıra boş dize alanları kaldırmak isterseniz:
;with C(XmlCol) as
(
select
(select T.*
for xml path('row'), type)
from @T as T
)
delete from C
where C.XmlCol.exist('row/*[. != ""]') = 0
@Elias Hossain 'ün parametrelenmiş modu aşağıda kopyalanmıştır.
create proc dbo.spDeleteRowsWhereAllColsAreNull
@Schema nvarchar(116),
@Table nvarchar(116)
as
begin
declare
@RetMsg nvarchar(max),
@CountRows int,
@ProcName nvarchar(255) = N'dbo.spDeleteRowsWhereAllColsAreNull',
@DynamicSql nvarchar(max) = N'',
@Schema_Table nvarchar(255) = @Schema + N'.' + @Table,
@Column nvarchar(116),
@Lb nchar(1) = char(13),
@Tab nchar(1) = char(9)
-- Check if target exists, else escape proc
if exists(select *
from sys.tables
where [object_id] = object_id(@Schema_Table))
begin
select @DynamicSql = 'delete from ' + @Schema_Table + N' where ' ;
-- Get all columns for target table into @DynamicSql
select @DynamicSql +=
@Tab + name+ N' is null and ' + @Lb
from sys.columns
where [object_id] = object_id(@Schema_Table) ;
set @DynamicSql = left(@DynamicSql, len(@DynamicSql) - 6) ;
-- print @DynamicSql ;
exec sp_executesql @DynamicSql ;
set @CountRows = @@rowcount ;
set @RetMsg = @ProcName + N' executed in current Database ' + db_name() + N' on table ' + @Schema_Table + N'. ' + convert(nvarchar, @CountRows) + N' row(s) deleted.' ;
-- Print results & return success
print @RetMsg ;
return 0 ;
end
else
begin
-- Raiserror & return failure
set @RetMsg = @Schema_Table + N' does not exist current Database ' + db_name() + N'. Execution FAILED!';
raiserror(@RetMsg, 11, -1) ;
return -1 ;
end ;
end ;
go
- 1. SQL tablonun boş bir satırı nasıl eklenir?
- 2. Tüm boş XElements'lar nasıl kaldırılır
- 3. Dize Boş alan nasıl kaldırılır
- 4. bir SQL satırı var mı?
- 5. Bir ObservableCollection <T> için bağlanırken DataGrid'in boş satırı nasıl kaldırılır?
- 6. Olağandışı ayrı bir sql tablosundan seçim yapacak sorgu nasıl yazılır?
- 7. Birden çok boş satırı doldurun
- 8. Üyelik özelliği nasıl kaldırılır, boş bir satır mı bırakılır?
- 9. JBuilder ile bir dizideki boş bir öğe tamamen nasıl kaldırılır
- 10. Bazı verileri içeren hücreyi içeren bir tablo satırı nasıl kaldırılır?
- 11. Datagridview'de her satırı döngüleme
- 12. Null satırları sql sorgu sonucundan nasıl kaldırılır?
- 13. Bir PostgreSQL tablosundan bir NOT NULL kısıtlaması bir seferde nasıl kaldırılır
- 14. Belirli bir dizeyi içeren bir satırı hangi yayınlar kaldırılır?
- 15. SQL Server tablosundan her bir kategori için farklı sayıda satır döndürme
- 16. Eklenen her satırı bir Tetikleyicide denetle
- 17. Her bir sütundaki boş değer sayısını sayın
- 18. İmleç olmadan SQL Server tablosundan kayıtları silme
- 19. S3 DeleteObject - DeleteMarker her zaman boş
- 20. Her istek için gerçek tablo FacturesAvoir tablosundan F_demande_Achat tablosundan nasıl miktar görüntüleyebilirim?
- 21. Qt boş olmayan bir klasörü nasıl kaldırılır Qt
- 22. Bir BigQuery tablosundan yinelenen satırları sil
- 23. AnonymousId her zaman boş
- 24. Varsayılan İstek Başlığı herhangi bir değeri kabul etmez, her zaman boş
- 25. C# olarak sql tablosundan satır sayısını saymak nasıl?
- 26. Swift'deki bir Dizide Her Diğer Eleman Nasıl Kaldırılır?
- 27. Her bir satırı karşılaştırmak için çizim grafiği?
- 28. sql: bir tablodan diğerine nasıl kopyalanır
- 29. git - boş klasör nasıl kaldırılır ve bu değişikliği nasıl değiştirirsiniz?
- 30. mysqli_insert_id() her zaman BOŞ