web-dev-qa-db-ja.com

列名を含むすべてのテーブルを更新する

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または同様のものを使用する必要がありますか?

2
Adam

このクエリは、テーブル名と一時テーブルへのフィールド名のリストを提供します。

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'の値になるようにすべてのテーブルを更新します

3
Rich Benner