2013-09-27 17 views
5

Mam tabelę SQL, która ma dużą liczbę kolumn. Z jakiegoś powodu niektóre kolumny mają puste komórki zamiast komórek NULL. Chciałbym, aby wszystkie puste komórki we wszystkich kolumnach miały wartość NULL.Zamień puste komórki na wartości NULL w dużej liczbie kolumn.

wiem, że droga do pojedynczej kolumny jest:

UPDATE your_table SET column = NULL WHERE column = '' 

Jednak nie jestem pewien jak wykonać podobną logikę efektywnie dla wszystkich kolumn bez konieczności pisania nazwy kolumn, jeden po drugim .

Dzięki,

+1

Potrzeba więcej czasu, aby znaleźć sprytny sposób, aby to zrobić, niż ręcznie zaktualizować każdą kolumnę. W rzeczywistości minęło 17 minut, odkąd zadałeś pytanie. Możliwe, że można już było zrobić. –

+1

@DanBracuk co to jest za zabawa? Nauka, jak robić to skutecznie teraz, może zaoszczędzić niezliczone minuty w dół drogi. –

Odpowiedz

18

uruchomić następujące zapytanie:

SELECT 'UPDATE yourtable SET ' + name + ' = NULL WHERE ' + name + ' = '''';' 
FROM syscolumns 
WHERE id = object_id('yourtable') 
    AND isnullable = 1; 

Dane wyjściowe tego zapytania będą fragmentem skryptu SQL w następujący sposób:

UPDATE yourtable SET column1 = NULL WHERE column1 = ''; 
UPDATE yourtable SET column2 = NULL WHERE column2 = ''; 
UPDATE yourtable SET column3 = NULL WHERE column3 = ''; 
-- etc... 

Skopiuj i wklej ten skrypt SQL do nowego zapytania i uruchom, aby zaktualizować wszystkie kolumny.

+0

To fajna sztuczka! Dzięki! Ale czy jest jakiś sposób, aby przekazać wyniki pierwszego zapytania do czegoś, co mogę uruchomić automatycznie? Robię to przez C#, dlatego ... Dzięki! – Mayou

+0

Zależy od tego, jak robisz dostęp do db, ale mówisz, że używasz C# i Linq To SQL, możesz zrobić coś takiego: 'using (MyDataContext db = new MyDataContext()) { string queryBuilder =". ..pierwsze zapytanie z góry ... "; var resultsetOfUpdateQueries = db.ExecuteQuery (queryBuilder); foreach (string oneUpdateQuery w resultsetOfUpdateQueries) { db.ExecuteCommand (oneUpdateQuery); } } ' Bez obaw o iniekcję SQL, ponieważ jedynymi zmiennymi składowymi dynamicznej instrukcji SQL będą wszystkie nazwy kolumn z tabeli słowników. –

+0

Dlaczego zrobiłbyś to, prawdopodobnie jednorazowe zadanie, wC#? – podiluska

3

można zrobić kwerendę na syscolumns aby uzyskać listę kolumn i wykorzystać wyniki skonstruować zapytanie.

select quotename(name) + ' = nullif (' + quotename(name)+ ','''')' 
from syscolumns 
where id = object_id('yourtable') 

Dodatkowo, jeśli napisać zapytanie jako

update yourtable 
set 
    yourcolumn=nullif(yourcolumn, ''), 
    yourcolumn2=nullif(yourcolumn2, ''), 
    ...  

wtedy można zrobić w jednym zapytaniu bez WHERE

+0

Nadal będę musiał napisać każdą kolumnę, aby sprawdzić "nullif". To nie byłoby zbyt wydajne. – Mayou

+0

Dzięki. Dostaję pierwszą część, ale nie jestem pewien, jak użyć wyniku pierwszego zapytania do napisania drugiego: tj. Jak przekazać nazwy kolumn uzyskane z pierwszego zapytania do drugiego zapytania. – Mayou

+1

@Mariam Łatwym sposobem jest skopiuj wyniki i wklej je do nowego zapytania. – podiluska

2

Właściwie używam odpowiedzi Roberta N powyżej codziennie, kiedy importuję płaskie zbiory danych, więc umieściłem to w przechowywanej procedurze, do której mogłem podać nazwę tabeli. Po prostu wypełnia tabelę tymczasową instrukcjami aktualizacji, a następnie wykonuje każdy wiersz w tabeli.

USE [master] 
    GO 
    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    -- ============================================= 
    -- Author:  LikeableBias 
    -- Create date: 2016-06-27 
    -- Description: Finds and NULLs all blank values in table where column allows nulls 
    -- ============================================= 
    CREATE PROCEDURE [dbo].[sproc_NullBlanks] 
     @tablename NVARCHAR(MAX) 
    AS 
    BEGIN 
     SET NOCOUNT ON; 
    --------Insert update statements to temp table for execution 
    DECLARE @statements TABLE (statement NVARCHAR(MAX)) 
    INSERT INTO @statements 
      (statement) 
     SELECT ('UPDATE '[email protected]+' SET [' + name + '] = NULL WHERE ' + name + ' = '''';') 
     FROM syscolumns 
     WHERE id = OBJECT_ID(@tablename) 
     AND isnullable = 1; 
    --------Open cursor, execute statements, then close cursor 
    DECLARE @statement NVARCHAR(MAX) 
    DECLARE cur CURSOR LOCAL FOR 
     SELECT statement FROM @statements 
    OPEN cur 
    FETCH NEXT FROM cur INTO @statement 
    WHILE @@FETCH_STATUS = 0 BEGIN 
     EXEC sys.sp_executesql @statement 
     FETCH NEXT FROM cur INTO @statement 
    END 
    CLOSE cur 
    DEALLOCATE cur 

    END 
    GO 
Powiązane problemy