我正在为一家公司工作,该公司将其客户的每个信息存储在不同的数据库中。当表需要修改时,我必须去每个数据库并运行ALTER TABLE
脚本。有没有一种方法可以使用准备好的语句来运行所有100多个DBO名称?SQL Studio Prepared Statement
ALTER TABLE ?.dbo.profileTable
ADD COLUMN profileStatus int
哪里? = 'CompanyA, CompanyB, CompanyC'
或类似的东西?
我正在为一家公司工作,该公司将其客户的每个信息存储在不同的数据库中。当表需要修改时,我必须去每个数据库并运行ALTER TABLE
脚本。有没有一种方法可以使用准备好的语句来运行所有100多个DBO名称?SQL Studio Prepared Statement
ALTER TABLE ?.dbo.profileTable
ADD COLUMN profileStatus int
哪里? = 'CompanyA, CompanyB, CompanyC'
或类似的东西?
EXECUTE master.sys.sp_MSforeachdb 'USE [?]; alter query'
[?]
用作迄今未指定的数据库名称
您可以修改查询,按您的需求,排除系统数据库使用如下..
的占位符EXECUTE master.sys.sp_MSforeachdb 'USE [?]; IF DB_ID(''?'') > 4 begin yourquery end'
当它试图针对系统数据库执行时,这不会引发错误吗? –
@JoeC:看到更新,你可以根据你的需要改变查询 – TheGameiswar
这个?
之前是数据库([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在每个数据库。
这将排除任何没有您正在查找的表的数据库,包括系统数据库。
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)
查看'sp_MSforeachtable'过程。 –
@ Mihai-DanielVirna你的意思是sp_MSforeachdb? – mxix
使用sp_msforeachdb时要非常小心。它有时会跳过数据库。这是另一种选择。 http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx –