我正在爲一家公司工作,該公司將其客戶的每個信息存儲在不同的數據庫中。當表需要修改時,我必須去每個數據庫並運行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 –