Tôi có một bảng có hơn 130 cột trong đó (đừng hỏi - tôi không tạo ra nó). Chúng ta cần loại bỏ mọi hàng trống (mỗi trường trống) từ bảng này mà không liệt kê rõ ràng từng cột. Lý tưởng nhất, tôi muốn một giải pháp sử dụng SQL động và có thể được áp dụng cho bất kỳ bảng nào. Tôi có thể làm cái này như thế nào?Cách xóa mọi hàng trống khỏi bất kỳ bảng SQL nào
Trả lời
Điều này sẽ giúp bạn có được một phần con đường đó ít nhất:
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
Lưu ý việc sử dụng QUOTENAME
để xử lý các cột tên kỳ quặc. Cũng lưu ý rằng điều này giả định tất cả các cột là cột chuỗi (hoặc có thể được chuyển đổi hoàn toàn thành chuỗi). Trong giải pháp của bạn, bạn có thể muốn một số logic có điều kiện (sử dụng CASE) để xử lý các kiểu dữ liệu khác nhau, ví dụ:
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
Tôi sẽ xem xét việc xem INFORMATION_SCHEMA
chế độ xem chứa thông tin về bàn, cột, khóa và các loại tương tự. Sử dụng chế độ xem TABLES
và COLUMNS
sẽ cho phép bạn có được giải pháp khá mạnh mẽ cho điều này. Đây là 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
Đối với một điều như thế này, tôi có xu hướng sử dụng trình tạo hoặc trình thiết kế truy vấn trực quan. Chúng tự động đặt vào tất cả các tên trường và bạn có thể sao chép và dán IS NULL hoặc = '' vào một sửa đổi điều kiện cho mỗi trường và nó tạo ra truy vấn chính xác. Sau khi xây dựng và kiểm tra chúng như là một SELECT tôi chuyển đổi chúng thành DELETE hoặc bất kỳ loại truy vấn nào khác là cần thiết.
Điều này sẽ xóa các hàng có mỗi cột là null
.
-- 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
Kết quả:
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/
Edit:
Nếu bạn muốn loại bỏ lĩnh vực chuỗi rỗng cũng như null
nó sẽ trông như thế này:
;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
Câu hỏi tham số được sao chép dưới đây.
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. xóa các hàng khỏi nhiều bảng
- 2. cách xóa mọi kiểu khỏi phần tử?
- 3. Làm cách nào để khôi phục các hàng đã xóa khỏi bảng máy chủ SQL?
- 4. Excel VBA - Xóa các hàng trống trong bảng
- 5. SQl Xóa top 100 khỏi bảng
- 6. Django: Xóa tất cả dữ liệu khỏi mọi bảng (nhưng vẫn giữ nguyên bảng)
- 7. Xóa các hàng khỏi bảng dữ liệu WPF
- 8. Bất kỳ cách nào để xóa/xóa/loại bỏ OutputCache?
- 9. IDataReader - Bất kỳ cách nào để nhận tổng số hàng?
- 10. Xóa tất cả các hàng khỏi bảng, ném nullpointer
- 11. Bất kỳ cách nào để xóa nền màu xám khỏi ImageButtons?
- 12. Làm cách nào để xóa tiền tố dbo khỏi tên bảng khi tôi viết câu lệnh sql trong SQL Server?
- 13. Làm cách nào để xóa hàng hiệu quả khỏi bảng Postgresql 8.1?
- 14. Chi tiết bảng trong SQL ở bất kỳ đâu?
- 15. Mysql Xóa nhiều hàng ngẫu nhiên khỏi một bảng
- 16. Làm cách nào để xóa dữ liệu khỏi nhiều bảng?
- 17. Làm cách nào để so sánh hai bảng và xóa các hàng trùng lặp trong SQL?
- 18. Tạo Bảng SQL cho mọi Người dùng Trang web (hàng nghìn) với hàng nghìn hàng?
- 19. Cách xóa thư khỏi hàng đợi JMS
- 20. Có bất kỳ polyfills nào để hiển thị: bảng, hàng, bảng, ô, vv
- 21. Không xóa hàng từ xem xóa hàng khỏi bảng cơ sở - MYsql?
- 22. Làm cách nào để xóa các hàng khỏi DataGridView?
- 23. Ruby xóa các dòng trống khỏi chuỗi
- 24. Cách xóa hàng riêng lẻ khỏi GROUP_CONCAT?
- 25. Cách xóa bất kỳ URL nào trong chuỗi bằng Python
- 26. Xóa hàng khỏi mảng php
- 27. Làm cách nào để xóa mọi thứ bên dưới hàng X trong VBA/Excel?
- 28. Python: Cách xóa danh sách trống khỏi danh sách?
- 29. cách bạn xóa mục nhập trống khỏi mảng
- 30. Chọn tất cả mọi thứ sau một hàng nhất định trong Bảng SQL đặt hàng