Заменить пустые ячейки значениями NULL в большом количестве столбцов

У меня есть таблица SQL, которая имеет большое количество столбцов. По какой-то причине некоторые столбцы имеют пустые ячейки вместо нулевых ячеек. Я хотел бы сделать все пустые ячейки во всех столбцах равными NULL.

Я знаю, что путь для одного столбца:

 UPDATE your_table SET column = NULL WHERE column = ''

однако я не уверен, как эффективно выполнить аналогичную логику для всех столбцов без необходимости писать имена столбцов один за другим.

спасибо,

3 ответов


выполнить следующий запрос:

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

вывод этого запроса будет фрагментом SQL-скрипта, как это:

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

скопируйте и вставьте этот сценарий SQL в новый запрос и запустите его, чтобы обновить все столбцы.


вы можете сделать запрос на syscolumns для получения списка столбцов, и использовать результаты для построения запроса.

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

кроме того, если вы напишите свой запрос как

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

затем вы можете сделать это в одном запросе без предложения where


Я фактически использую ответ Роберта N выше ежедневно, когда импортирую наборы данных плоских файлов, поэтому я помещаю его в хранимую процедуру, в которую я могу передать имя таблицы. Он просто заполняет временную таблицу инструкциями update, а затем выполняет каждую строку в таблице.

    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 '+@tablename+' 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