2016-08-01 7 views
4

私は、それぞれのクライアントの情報を別のデータベースに保存する会社の仕事をしています。テーブルを変更する必要がある場合は、各データベースに行き、ALTER TABLEスクリプトを実行する必要があります。準備された文を使用して100以上のDBO名をすべて実行できる方法はありますか?SQL Studio Prepared Statement

ALTER TABLE ?.dbo.profileTable 
ADD COLUMN profileStatus int 

ここで、 = 'CompanyA, CompanyB, CompanyC'またはそれに類するもの?

+1

'sp_MSforeachtable'プロシージャを見てください。 –

+0

@ Mihai-DanielVirnaあなたはsp_MSforeachdbを意味しますか? – mxix

+0

sp_msforeachdbを使用する場合は非常に注意してください。データベースをスキップすることがあります。ここに別の方法があります。 http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx –

答えて

2

Use Sp_MSforeachdb

EXECUTE master.sys.sp_MSforeachdb 'USE [?]; alter query' 

[?]あなたは以下のように使用してシステムデータベースを除外するために、あなたのニーズごとにクエリを変更することができます

これまでに指定されていないデータベース名のプレースホルダとして使用します。..

EXECUTE master.sys.sp_MSforeachdb 'USE [?]; IF DB_ID(''?'') > 4 begin yourquery end' 
+1

これは、システムデータベースに対して実行しようとするとエラーをスローしませんか? –

+0

@JoeC:あなたのニーズに合わせてクエリを変更することができます。 – TheGameiswar

0

この?は、前にデータベース([database].[schema].[table])です。したがって、sp_MSforeachdbを使用するか、好きなようにsys.databasesビューを使用して動的クエリを準備することができます。

両方の方法がシステムデータベースに干渉する可能性があるので注意してください。

は、このソリューションを見てみましょう:

DECLARE @query nvarchar(MAX)=''; 

SELECT @query = @query + 'USE '+QUOTENAME(name)+';ALTER TABLE dbo.profileTable ADD profileStatus int;' 
FROM sys.databases 
WHERE OBJECT_ID(QUOTENAME(name)+'.dbo.profileTable', 'U') IS NOT NULL 

EXEC(@query) 

これは、すべてのデータベース内の各dbo.profileTableに列col1 intが追加されます。

1

これは、システムデータベースを含む、探しているテーブルを持たないデータベースは除外します。

Declare @TableName Varchar(8000) = 'ProfileTable' 
Declare @Sql Varchar(8000) 

Select @Sql = Stuff(
(Select ';', 'Alter Table ' + Name + SqlText 
    From sys.databases 
    Cross Apply (Select '.dbo.profileTable ADD profileStatus int' SqlText) CA 
    Where Case When State_Desc = 'ONLINE' 
      Then Object_Id (QuoteName(Name) + '.[dbo].' + @TableName, 'U') 
     End Is Not Null 

    FOR XML PATH('') 
),1,1,'') 

Exec (@Sql) 
関連する問題