2014-01-24 68 views
0

作爲應用程序安裝程序的一部分,我需要將一些數據插入到已存在的數據庫中。數據庫的結構是已知的,但確切的名稱不是;即我知道我需要插入的表的名稱及其結構,但db名稱是可變的。將數據插入名稱在執行時未知的數據庫中

db名稱的結構是:AppDB_<version#>(例如:AppDB_V20_1_2)。不幸的是,安裝此應用程序的主要新版本時,以前的DBS保留在服務器上,所以一個查詢:

SELECT name FROM master..sysdatabases WHERE name LIKE 'AppDB%' 

返回多個結果。

是否可以創建一個在整個結果範圍內插入相同表的查詢?

也就是說,如果我有數據庫:

AppDB_V1 
AppDB_V2 
AppDB_V3 

我可以編寫一個查詢,有效的作用:

INSERT INTO [AppDB_V1].[dbo].[TableName] ... 
INSERT INTO [AppDB_V2].[dbo].[TableName] ... 
INSERT INTO [AppDB_V3].[dbo].[TableName] ... 

不知道AppDB小號事先的編號或名稱?

+0

你可以像['sp_foreachdb'](http://weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx)那樣使用一些愚蠢的東西,但我建議使用一致的名稱數據庫的當前版本,例如('AppDB'),如果您絕對需要舊版本(這就是備份的目的,btw),然後將其重命名爲版本號。 –

+0

@Dave不幸的是,數據庫命名方案已經不在我的手中了,因爲對於每個人來說都會更好。 –

+0

您可以將它設置爲應用程序安裝前手動設置的配置值嗎?另一種方法是修改安裝程序或使用InstallShield或類似的東西,讓管理員用戶進行安裝以輸入數據庫名稱,您可以從中創建必要的連接字符串。 –

回答

2

您可以使用動態sql來構建插入語句。看看sp_executesql

查詢數據庫名稱。然後使用遊標查看數據庫名稱並創建一個插入字符串。然後用sp_executesql執行它。

希望它能幫助!

0

您可以生成這樣一個動態的SQL語句:

聲明@sql mvarchar(最大);

set @sql = N'';

select @sql = @sql + N',插入'+ quotename(db.name)+ N'.dbo.Table1 from dbo.SourceTable;' + char(13);

從sys.databases中DB

其中db.name像...

組@sql =東西(@sql,1,1,N '');

exec(@sql);