2016-08-01 60 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) 
相关问题