2013-03-14 143 views
3

我們正在運行SQL Server 2008 R2和創造,這將創建一個新的數據庫(以後可以脫機並存儲在別處)的存檔功能,然後拿數據出來我們的主數據庫,並把它進入新的數據庫,最後,在主數據庫中創建一個視圖來查看新表中的存檔數據。創建視圖

我的腳本來創建數據庫,創建新數據庫的歸檔表,從主數據庫複製的記錄,並把它們到歸檔數據庫,並從主數據庫中刪除記錄。現在我正在嘗試創建視圖的腳本:

declare @sql varchar(8000) 
set @sql = 'create view [' + @srcdb + '].[dbo].[vw_artrans] as 
      select * from [' + @srcdb + '].[dbo].artrans 
      union 
      select * from [' + @archdb + '].[dbo].artrans' 
exec (@sql) 

但是,您無法傳遞數據庫的名稱來創建視圖。

所以,我想這個代替:

declare @sql varchar(8000) 
set @sql = 'use ' + @srcdb + ' 
      go 
      create view [vw_artrans] as 
      select * from [' + @srcdb + '].[dbo].artrans 
      union 
      select * from [' + @archdb + '].[dbo].artrans' 
exec (@sql) 

但現在抱怨GO語句(不正確的語法)。

爲存檔數據創建的數據庫的名稱是在腳本中動態確定的(@archdb包含名稱),所以我無法在數據庫名稱中編寫腳本,也無法運行第二個腳本。

+0

正如一個側面評論,你真的需要一個'UNION',意味着你需要從工會得到不同的行?它比'UNION ALL'慢得多,它只是結合了兩個輸出。你聲明*「然後將數據從我們的主數據庫中取出並放入新的數據庫」*,這讓我認爲你想要'UNION ALL'。 – 2013-03-14 17:36:15

+0

@DominicGoulet:你是正確的......我忘了,當我在樣本SQL打字的ALL。 – Caynadian 2013-03-15 15:36:43

+0

@MichaelFredrickson:我需要有一個GO命令,因爲CREATE VIEW將無法正常工作,除非它在腳本中的第一個語句。 – Caynadian 2013-03-15 15:37:31

回答

4

基於@Sebastien答案,這裏是解決方案:

declare @sql varchar(8000) 

set @sql = 'EXEC ' + @srcdb + '.sys.sp_executesql N''create view [vw_artrans] as 
      select * from [' + @srcdb + '].[dbo].artrans 
      union 
      select * from [' + @archdb + '].[dbo].artrans'';' 

exec (@sql) 
+0

感謝的上下文中運行!這正是我要找的。 – Caynadian 2013-03-15 15:41:58

3

在不同的數據庫比一個你在你可以使用sp_executesql的這樣執行動態SQL語句:返回

USE db1; 
EXEC db2.sys.sp_executesql N'SELECT DB_NAME();'; 

這WIL結果在DB2中。

GO不是T-SQL語句。它被SSMS解釋爲將查詢文本分成批次。它永遠不會發送到SQL Server本身。

+0

我將您的解決方案擴展到@Caynadian可以使用的解決方案。 – 2013-03-14 17:34:05

+0

+1我是莫名其妙不知道完全限定'sp_executesql'將使其在限定的數據庫... – 2013-03-14 18:02:00