2011-11-22 31 views
5

से प्रत्येक खाली पंक्ति को कैसे निकालें I इसमें 130 से अधिक कॉलम वाली एक तालिका है (पूछें - मैंने इसे नहीं बनाया)। प्रत्येक तालिका को स्पष्ट रूप से सूचीबद्ध किए बिना हमें इस तालिका से प्रत्येक खाली पंक्ति (प्रत्येक फ़ील्ड खाली) को हटाने की आवश्यकता है। आदर्श रूप में, मुझे एक समाधान चाहिए जो गतिशील एसक्यूएल का उपयोग करता है और किसी भी तालिका पर लागू किया जा सकता है। मैं यह कैसे कर सकता हूँ?किसी भी SQL तालिका

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 

नोट QUOTENAME के उपयोग अजीब तरह से नाम कॉलम की संभाल करने के लिए:

उत्तर

3

यह आपको कम से कम वहाँ जिस तरह से हिस्सा मिल जाएगा। यह भी ध्यान रखें कि यह मानता है कि सभी कॉलम स्ट्रिंग कॉलम हैं (या एक स्ट्रिंग में निहित रूप से परिवर्तित किया जा सकता है)। आपके समाधान में, आप अलग-अलग डेटाटाइप को संभालने के लिए कुछ सशर्त तर्क (CASE का उपयोग कर सकते हैं)

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 
0

मैं INFORMATION_SCHEMA बार देखा गया है जो आपके टेबल, कॉलम, कुंजी और के बारे में जानकारी होती है पर एक नज़र डालने पर विचार करेंगे। TABLES और COLUMNS विचारों का उपयोग करके आपको इसके लिए एक मजबूत मजबूत समाधान प्राप्त करने की अनुमति देनी चाहिए। यहां MSDN documentation है।

0
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 
0

इस तरह की चीजों के लिए मैं दृश्य क्वेरी बिल्डर्स या डिजाइनरों का उपयोग करता हूं। वे स्वचालित रूप से सभी फ़ील्ड नामों में डालते हैं और आप प्रत्येक फ़ील्ड के लिए एक शर्त संपादित करने में IS NULL या = '' को कॉपी और पेस्ट कर सकते हैं और यह सही क्वेरी उत्पन्न करता है। चयन के रूप में उन्हें बनाने और परीक्षण करने के बाद मैं उन्हें DELETE में परिवर्तित करता हूं या जो भी अन्य क्वेरी प्रकार की आवश्यकता होती है।

2

यह उन पंक्तियों को हटा देगा जहां प्रत्येक कॉलम 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 

परिणाम:

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/

संपादित करें:

आप 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 
0

@Elias Hossain का पैरामीटरेटेड मोड नीचे कॉपी किया गया।

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 
संबंधित मुद्दे