用大量列中的NULL值替换空单元格

时间:2013-09-27 17:14:46

标签: sql sql-server sql-server-2005 null

我有一个包含大量列的SQL表。出于某种原因,某些列具有空单元而不是NULL单元。我想让所有列中的所有空单元格都为NULL。

我知道单列的方法是:

 UPDATE your_table SET column = NULL WHERE column = ''

但是,我不确定如何有效地为所有列执行类似的逻辑,而不必逐个编写列名。

谢谢,

3 个答案:

答案 0 :(得分:21)

运行以下查询:

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脚本复制并粘贴到新查询中并运行它以更新所有列。

答案 1 :(得分:3)

您可以对syscolumns进行查询以获取列列表,并使用结果构建查询。

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

此外,如果您将查询编写为

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

然后你可以在没有where子句

的单个查询中完成

答案 2 :(得分:2)

当我导入平面文件数据集时,我实际上每天都使用Robert 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