web-dev-qa-db-ja.com

多数の列で空のセルをNULL値に置き換えます

多数の列を持つSQLテーブルがあります。何らかの理由で、一部の列にはNULLセルではなく空のセルがあります。すべての列のすべての空のセルをNULLにしたいのですが。

単一の列に移動する方法は次のとおりです。

 UPDATE your_table SET column = NULL WHERE column = ''

ただし、列名を1つずつ記述せずに、すべての列に対して同様のロジックを効率的に実行する方法がわかりません。

ありがとう、

9
Mayou

次のクエリを実行します。

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スクリプトをコピーして新しいクエリに貼り付け、実行してすべての列を更新します。

22
Robert N

syscolumnsでクエリを実行して列のリストを取得し、その結果を使用してクエリを作成できます。

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

さらに、クエリを次のように記述した場合

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

次に、where句なしで単一のクエリでそれを行うことができます

3
podiluska

フラットファイルデータセットをインポートするときは、実際には上記のRobert Nの回答を毎日使用しているので、テーブル名を渡すことができるストアドプロシージャに入れます。一時テーブルに更新ステートメントを入力し、テーブルの各行を実行するだけです。

    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
3
LikeableBias