2011-01-28 3 views
1

したがって、おおよそ150個のSQL Server 2005データベースがすべて互いにコピーされています。それぞれにPasswordChangedというフィールドを持つbvc_Userというテーブルがあります。今のところ、PasswordChangedはnull可能なビットフィールドです。T-SQLは、存在する任意のデータベースのフィールドを変更します。

デフォルトの値が0のヌル入力不可のビットフィールドにすべてのインスタンスを変更し、現在テーブルのデータにあるNULL値を1に設定したいと思います(はい、デフォルトに設定したくありません0)。

おそらくNULL設定の更新と既に存在するデータベース値の対応する更新を行うことができますが、私の主な質問は、どのようにしてサーバー上のすべてのデータベースをループしてbvc_Userテーブルサーバー上のすべてのDBが持っているわけではありません)、存在する場合は、PasswordChangedフィールドを変更しますか?

+0

これはSQL Serverですか? – JNK

+0

「単一のT-SQLコマンド」とはどういう意味ですか?実行可能なT-SQLの1行を意味しますか? –

+0

SQL Server 2005を反映するように質問/タグが更新されました。また、「single t-sql」コマンドでは、単一のステートメントである必要はありません。ちょうど私は新しいクエリウィンドウにドロップして一度実行することができます。 – Scott

答えて

4

sp_msforeachdbを使用して、すべてのデータベースでコマンドを実行できます。テーブルを実際に使用する前に、そのテーブルの存在を確認します。

sp_msforeachdb ' 
    If Exists(Select 1 
      From [?].Information_Schema.Tables 
      Where Table_Name = ''bvc_User'') 
    Update [?].dbo.bvc_User 
    Set PasswordChanged = 1 
    Where PasswordChanged Is NULL' 
+1

+1 - 私にそれを打つ。 'ALTER TABLE ALTER COLUMN'コマンドと同じ方法が働きます。 – JNK

+0

ありがとうございます。私は、同じプロセスをALTER TABLEコマンドとUPDATEコマンドの両方に適用できると考えました。 – Scott

0

3枚:

DECLARE @dbNames TABLE (Id int IDENTITY, name nvarchar(50)) 

INSERT INTO @dbNames 
SELECT name FROM sysdatabases 

DECLARE @statement nvarchar(540) 
DECLARE @dbName nvarchar(50) 

DECLARE @maxId int 

SELECT @maxId = MAX(Id) FROM @dbNames 

DECLARE @i int 

SET @i = 1 

WHILE @i < @maxId 
BEGIN 
SEt @dbName = 'dbName' 

SET @statement = 'USE ' + @dbName + CHAR(13) + '--execute table specific alter table logic here' 

EXEC sp_ExecuteSql @statement 
SET @i = @i + 1 
END 

HTH:動的SQLを実行し、それらを介して、ループをDB名を取得。

+0

組み込みの 'sp_msforeachdb'コマンドで簡単に行えます。 – JNK

+0

合意 - 毎日何か新しいことを学びます。 –

関連する問題