特定のテーブルのすべての NULL 値を NULL ではなく空の文字列に変更するために、いくつかの SQL Server データベースで更新を行う予定です。何百ものデータベースでこれを行う可能性があります。テーブル名は常に同じですが、列名はフロントエンド アプリケーションの構成方法に基づいて可変です (判断しないでください... 私はこのシステムを作成していません)。
事前に列名を知らなくても、これらすべての列を更新する方法はありますか?
特定のテーブルのすべての NULL 値を NULL ではなく空の文字列に変更するために、いくつかの SQL Server データベースで更新を行う予定です。何百ものデータベースでこれを行う可能性があります。テーブル名は常に同じですが、列名はフロントエンド アプリケーションの構成方法に基づいて可変です (判断しないでください... 私はこのシステムを作成していません)。
事前に列名を知らなくても、これらすべての列を更新する方法はありますか?
動的SQLで列の名前を渡すことができます:
declare @sql nvarchar (1000);
set @sql = N'update table set ' + @column_name + '= ''''';
exec sp_executesql @sql;
テーブルを調べてsys.columns
、テーブル名または object_id で結合できます。
DECLARE @OBJ_ID INT
SELECT @OBJ_ID = OBJECT_ID
FROM SYS.tables
WHERE name = 'YOURTABLE'
SELECT * FROM SYS.columns
WHERE OBJECT_ID = @OBJ_ID
name
更新を実行するための基礎として、sys.columns クエリのフィールドを使用できます。
varchar/char 型のすべての列のみが必要であると仮定します (または型フィルターを必要なものに変更します)。
DECLARE @tableName varchar(10)
SET @tableName = 'yourtablenamehere'
DECLARE @sql VARCHAR(MAX)
SET @sql = ''
SELECT @sql = @sql + 'UPDATE ' + @tableName + ' SET ' + c.name + ' = '''' WHERE ' + c.name + ' IS NULL ;'
FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
INNER JOIN sys.types y ON c.system_type_id = y.system_type_id
WHERE t.name = @tableName AND y.name IN ('varchar', 'nvarchar', 'char', 'nchar')
EXEC (@sql)
これは、テーブル名がわかっている場合に機能します。
DECLARE @tableName varchar(10)
SET @tableName = 'Customers'
DECLARE @sql VARCHAR(MAX)
SET @sql = ''
SELECT @sql = @sql + 'UPDATE ' + @tableName + ' SET ' + c.name + ' = ISNULL('+ c.name +','''');'
FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
INNER JOIN sys.types y ON c.system_type_id = y.system_type_id
WHERE y.name IN ('varchar', 'nvarchar', 'char', 'nchar')
AND t.name = @tableName;
EXEC(@sql);
これにより、Db 内のすべてのテーブルとすべての列が反復処理されます。
DECLARE @sql VARCHAR(MAX)
SET @sql = ''
SELECT @sql = @sql + 'UPDATE ' + t.name + ' SET ' + c.name + ' = ISNULL('+ c.name +','''');'
FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
INNER JOIN sys.types y ON c.system_type_id = y.system_type_id
WHERE y.name IN ('varchar', 'nvarchar', 'char', 'nchar');
EXEC(@sql);