多数の列を持つSQLテーブルがあります。何らかの理由で、一部の列にはNULLセルではなく空のセルがあります。すべての列のすべての空のセルをNULLにしたいのですが。
単一の列に移動する方法は次のとおりです。
UPDATE your_table SET column = NULL WHERE column = ''
ただし、列名を1つずつ記述せずに、すべての列に対して同様のロジックを効率的に実行する方法がわかりません。
ありがとう、
次のクエリを実行します。
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句なしで単一のクエリでそれを行うことができます
フラットファイルデータセットをインポートするときは、実際には上記の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