2017-10-26 23 views
0

where句を使用して選択されたテーブルのリストに対して同じ一連のアクションを実行しようとしています。テーブルを反復するためのt-sql forループ

これはテーブル名のリストを生成します。これはforループで処理したいテーブルです。このようなテーブルのリストを反復する方法はありますか?このアクションを達成するための一つの方法では、SQLカーソルに変更し、各テーブルの上にALTER tableコマンドを実行するためにカーソルを反復処理するテーブルのリストを供給することです

for i in @tablelist: 

    alter table i add new_col varchar(8); 
    update i set new_col = old_col; 
+0

Hmm ... DMLクエリでDDLを実行できる場合は...実際には、私はあなたができないと確信しています。 –

+0

動的SQLを使用する必要があります –

+0

なぜ新しい列を追加して別の列と同じ値に設定するのですか?これは、同じデータを持つ2つの列を持つのは馬鹿げているようです。おそらくあなたは古い列をドロップするだろうか?単純にこれらの列の名前を変更することも可能です。 –

答えて

3

あなたはこの試みることができる:あなたがcursorsまたはwhile構築存在を使用する必要がいずれかのループについて

DECLARE @Table TABLE 
(
TableName VARCHAR(50), 
Id int identity(1,1) 
) 


INSERT INTO @Table 
Select table_name From INFORMATION_SCHEMA.COLUMNS 
Where column_name = 'fieldA' 

DECLARE @max int 
DECLARE @SQL VARCHAR(MAX) 
DECLARE @TableName VARCHAR(50) 
DECLARE @id int = 1 

select @max = MAX(Id) from @Table 


WHILE (@id <= @max) 
BEGIN 

SELECT @TableName = TableName FROM @Table WHERE Id = @id 
SET @SQL =  'alter table '+ @TableName +' add new_col varchar(8); 
       update '+ @TableName + ' set new_col = old_col;' 
PRINT(@SQL) --COMMENT THIS LINE OUT AND COMMENT IN THE NEXT EXEC(@SQL) IF YOU SEE THE CORRECT OUTPUT 
--EXEC(@SQL) 
SET @id = @id +1 
END 
1

。 SQLカーソルを作成する方法についてのドキュメントはここで見つけることができます: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql

これはカウントイテレータをSQLでwhileループを使用することでしょう達成する別の方法を。このソリューションについての情報はここで見つけることができます: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/while-transact-sql

1

を、あなたは一時テーブルから毎回エントリを削除する場所それを処理する。

テーブル名をクエリに渡す方法として、動的SQLクエリを作成せずに行う方法はありません。あなたは、正しい場所にテーブル名を連結して文字列でクエリを作成することでそれを行います。スペースや奇妙な文字がある場合は、QUOTENAME関数を使用して名前のクォートを実行します。カーソルで

例:あなたはこのために、ループを使用する必要はありません

DECLARE @tables TABLE (
    Name SYSNAME 
); 
DECLARE @tableName SYSNAME; 
DECLARE @sql NVARCHAR(4000); 

INSERT INTO @tables 
SELECT i.table_name 
FROM INFORMATION_SCHEMA.COLUMNS i 
WHERE i.column_name = 'fieldA'; 

DECLARE cur CURSOR LOCAL FAST_FORWARD 
FOR 
SELECT Name 
FROM @tables; 

OPEN cur; 

FETCH NEXT FROM cur 
INTO @tableName; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql = N'ALTER TABLE ' + QUOTENAME(@tableName) + N' ADD new_col varchar(8);'; 
    SET @sql = @sql + N'UPDATE ' + QUOTENAME(@tableName) + N' SET new_col = old_col;'; 

    EXEC sp_executesql @sql; 

    FETCH NEXT FROM cur 
    INTO @tableName;  
END 

CLOSE cur; 
DEALLOCATE cur; 
3

。システムビューを使用すると、動的SQLをループよりもずっと簡単に(しかも高速に)生成することができます。

declare @SQL nvarchar(max) = '' 

select @SQL = @SQL + 'alter table ['+ c.TABLE_NAME +'] add new_col varchar(8); 
       update ['+ c.TABLE_NAME + '] set new_col = old_col;' 
from INFORMATION_SCHEMA.COLUMNS c 
where c.COLUMN_NAME = 'fieldA' 

select @SQL 
--uncomment below when you are satisfied with the dynamic sql 
--exec sp_executesql @SQL 
+0

最後のステップでは、EXEC(@SQL)を書き込みます。 –

+0

@BartoszSiemasz NO。 sp_executesqlを使用する方が良い選択です。この場合、それほど重要ではありませんが、EXECはsp_executesqlが実行するパラメータを許可しません。 http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/17/bad-habits-to-kick-using-exec-instead-of-sp-executesql.aspx –

+0

[OK]を選択すると、sp_executesqlは将来の改正、権利。 –

関連する問題