いくつかのSQL Serverデータベースで更新を行い、特定のテーブルのすべてのNULL値をNULLではなく空の文字列に変更することを検討しています。私たちは潜在的に何百ものデータベースにわたってこれをやろうとしています。テーブル名は常に同じですが、列名はフロントエンドアプリケーションの構成に基づいて変わります(判断しないでください...私はこのシステムを作成しませんでした)。変数の列名を使用した動的更新ステートメント
事前に列名を知らなくてもこれらの列すべてを更新する方法はありますか?
いくつかのSQL Serverデータベースで更新を行い、特定のテーブルのすべてのNULL値をNULLではなく空の文字列に変更することを検討しています。私たちは潜在的に何百ものデータベースにわたってこれをやろうとしています。テーブル名は常に同じですが、列名はフロントエンドアプリケーションの構成に基づいて変わります(判断しないでください...私はこのシステムを作成しませんでした)。変数の列名を使用した動的更新ステートメント
事前に列名を知らなくてもこれらの列すべてを更新する方法はありますか?
動的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
あなたは上の更新を実行するための基礎としてsys.columnsクエリからname
フィールドを使用することができます。
は、あなただけの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)
動的オブジェクト名の周りには常に[quotname'](http://stackoverflow.com/a/6285111/11683)を使用してください。 – GSerg
@GSerg +1は 'quotename()'に言及します。これは、内部DMLの場合に限られているので、ここでの使用は余計なようです。もしそれが公衆(または地獄でさえ、内部でさえ)の対面サイトからのユーザ入力で実行されるsprocなら、私はすべてであろう。 – CaptainMarvel