2016-08-01 99 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) 

它增加了列col1 int每個dbo.profileTable在每個數據庫。

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) 
相關問題