便利なカーソルを使用してこれを行うことができます(SQLサーバーを想定):
DECLARE @Iterator varchar(55)
DECLARE @strSQL varchar(8000) -- for dynamic sql set then exec variable
DECLARE xyz CURSOR
FOR
--Select stuff to iterate over
SELECT c.name ColumnName
FROM sys.columns c INNER JOIN
sys.tables t ON c.object_id = t.object_id INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
WHERE t.name = 'table'
OPEN xyz
FETCH NEXT FROM xyz
INTO @Iterator
WHILE @@FETCH_STATUS = 0
BEGIN
--Do stuff
SET @strSQL = '
UPDATE TableName
SET '+@Iterator+' = NULL
WHERE '+@Iterator+' = ''junk''
GO'
PRINT (@strSQL)
FETCH NEXT FROM xyz
INTO @Iterator
END
CLOSE xyz
DEALLOCATE xyz
GO
この更新を実際に実行するには、PRINT(@strSQL) を EXEC(@strSQL) に変更し、最初に PRINT を実行して、ステートメントが希望どおりに読み取られるようにします。
更新: すべてのテーブル/列をループするには、これですべてのテーブルのカーソルを出力できますが、外側のカーソルを実行することはできません。
DECLARE @Iterator varchar(55)
DECLARE @strSQL varchar(8000) -- for dynamic sql set then exec variable
DECLARE xyz CURSOR
FOR
--Select stuff to iterate over
SELECT DISTINCT t.name TableName
FROM sys.tables t INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
OPEN xyz
FETCH NEXT FROM xyz
INTO @Iterator
WHILE @@FETCH_STATUS = 0
BEGIN
--Do stuff
SET @strSQL = 'DECLARE @Iterator varchar(55)
DECLARE @strSQL varchar(8000) -- for dynamic sql set then exec variable
DECLARE xyz CURSOR
FOR
--Select stuff to iterate over
SELECT c.name ColumnName
FROM sys.columns c INNER JOIN
sys.tables t ON c.object_id = t.object_id INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
WHERE t.name = '''+@Iterator+'''
OPEN xyz
FETCH NEXT FROM xyz
INTO @Iterator
WHILE @@FETCH_STATUS = 0
BEGIN
--Do stuff
SET @strSQL = ''
UPDATE '+@Iterator+'
SET ''+@Iterator+'' = NULL
WHERE ''+@Iterator+'' = ''''junk''''
GO''
PRINT (@strSQL)
FETCH NEXT FROM xyz
INTO @Iterator
END
CLOSE xyz
DEALLOCATE xyz
GO
'
PRINT (@strSQL)
FETCH NEXT FROM xyz
INTO @Iterator
END
CLOSE xyz
DEALLOCATE xyz
GO