2008-11-04 55 views
4

SQL Server 2005中有兩個數據庫:一個名爲「A」,另一個名爲「A_2」。 「A」是要由用戶輸入的變量名稱,第二個數據庫的「_2」前綴總是已知的。 (因此數據庫可能是「MyDB」和「MyDB_2」等)

如何從存儲過程內訪問其他數據庫而不知道實際名稱並且不使用'exec'語句?在SQL Server中使用動態名稱訪問另一個數據庫

回答

7

您可以嘗試使用新的SQL Server 2005功能,稱爲同義詞。

您需要CREATE SYNONYM,然後使用同義詞編譯並保存存儲過程。這會讓你有可能在稍後「隨時」改變同義詞。顯然,仍然有必要將CREATE SYNONYM代碼作爲動態SQL運行。

要運行CREATE SYNONYM,必須授予用戶各自的權限,或者擁有ALTER SCHEMA權限。在走這條路線之前,請務必閱讀更多關於同義詞的內容,附上一些字符串。

0

我不認爲這是可能的。

該名稱是一個變量,您不能將變量用作數據庫名稱。

所以唯一的方法就是把整個命令放到一個字符串中,然後執行它,這是你想避免的。

整個事情的目的是什麼?如果在邏輯上命名數據庫會發生什麼情況,但在某處存儲邏輯和用戶輸入的名稱之間的鏈接?

+0

是的,這將是後備的解決方案: 編寫的軟件,這將在安裝前替換數據庫腳本與他們最後的值數據庫名稱。 我想也許有人知道另一種解決方案,比使用DBNAME()和EXEC ... – Marc 2008-11-04 10:37:30

+0

不幸的是,你不能使用變量作爲數據庫名稱或字段名稱,而不使用exec。在數據庫腳本中進行搜索和替換很容易,所以我會這麼做。 – Biri 2008-11-04 10:42:21

0

我所做的是爲每個我想訪問的表創建一個視圖(大概模式是相同的),然後我的後續代碼只是引用了視圖。例如

if object_id('view_Table1') is not null 
    drop view view_Table1 

dim @cmd nvarchar(max) 

set @cmd = 'create view view_Table1 as select * from ' + @DbName + '.dbo.Table1' 

exec sp_executesql @cmd 

select WhateverColumn from view_Table1 
相關問題