SQL Serverでは、COLUMN_NAME
を含むすべてのテーブルを見つけることができます。
SELECT *
FROM INFORMATION_SCHEMA.columns
WHERE COLUMN_NAME = 'COLUMN_NAME'
これらの列をすべて更新するにはどうすればよいですか?
UPDATE <table> SET <column_name> = 123
このソリューションはSQL Server 2012以降で機能する必要があります。私の場合、列は常に同じデータ型になります:bigint
CURSOR
または同様のものを使用する必要がありますか?
このクエリは、テーブル名と一時テーブルへのフィールド名のリストを提供します。
IF OBJECT_ID('tempdb..#BaseData') IS NOT NULL DROP TABLE #BaseData
GO
CREATE TABLE #BaseData (Schema_Name sysname, Table_Name sysname, Field_Name sysname, SQLScript varchar(max));
DECLARE @FieldName varchar(20); SET @FieldName = 'COLUMN_NAME';
INSERT INTO #BaseData (Schema_Name, Table_Name, Field_Name, SQLScript)
SELECT
s.name
,o.name
,c.name
,'ALTER TABLE ' + s.name + '.' + o.name + ' SET ' + c.name + ' = ''123'''
FROM sys.columns c
JOIN sys.types t
ON c.user_type_id = t.user_type_id
JOIN sys.objects o
ON c.object_id = o.object_id
JOIN sys.schemas s ON o.schema_id=s.schema_id
WHERE c.name LIKE @FieldName
AND o.type_desc = 'USER_TABLE';
SELECT * FROM #BaseData
結果は次のようになります。最初の3つの列は完全に必要なわけではありませんが、データをまとめる方法を示すために含めました。
Schema_Name Table_Name Field_Name SQLScript
dbo Table1 Column_Name ALTER TABLE dbo.Table1 SET Column_Name = '123'
dbo Table2 Column_Name ALTER TABLE dbo.Table2 SET Column_Name = '123'
dbo Table3 Column_Name ALTER TABLE dbo.Table3 SET Column_Name = '123'
dbo Table4 Column_Name ALTER TABLE dbo.Table4 SET Column_Name = '123'
その後、カーソルを使用してデータの各行を実行できます。
DECLARE @sql VARCHAR(MAX)
DECLARE @SqlScript VARCHAR(max)
DECLARE c CURSOR LOCAL FAST_FORWARD FOR
SELECT SQLScript
FROM #BaseData;
OPEN c;
FETCH NEXT FROM c INTO @SQLScript;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = @SqlScript
EXEC(@sql);
FETCH NEXT FROM c INTO @SQLScript;
END
CLOSE c;
DEALLOCATE c;
これにより、以前に作成したコードの各行が実行されます。上記のサンプルコードは、Column_Name = '123'の値になるようにすべてのテーブルを更新します