2014-05-06 47 views
3

我發現這裏的樣本代碼:有沒有一種方法來查詢SQL Server鏈接服務器沒有硬編碼數據庫名稱?

SELECT * FROM [legacyserver].[database].[schema].[table] 

表示爲:

SELECT * FROM [legacyserver]...[table] 

,但不是爲我工作。

它給我的錯誤:我使用了傳統的服務器SQL Server 2000和新的服務器SQL Server 2012的

我嘗試使用創建鏈接的服務器

An invalid schema or catalog was specified for the provider "MSDASQL" for linked server "legacyserver".

EXEC sp_addlinkedserver 
    @server = 'legacyserver', 
    @srvproduct = '', 
    @provider = 'MSDASQL', 
    @provstr = 'DRIVER={SQL Server};SERVER=legacyserver;DATABASE=database;Trusted_Connection=Yes;', 

和:

EXEC sp_addlinkedserver 
    @server = 'legacyserver', 
    @srvproduct = '', 
    @provider = 'MSDASQL', 
    @provstr = 'DRIVER={SQL Server};SERVER=legacyserver;Trusted_Connection=Yes;', 
    @catalog = 'database'; 

是否有可能建立一個沒有硬編碼的數據庫名稱的腳本?

我需要建立一個真正的大遷移腳本,它需要使用的開發,驗收和生產數據庫,這將是大量的工作,而且容易出錯使用文本編輯器代替去改變它。

UPDATE:

遺留髮展,驗收和生產數據庫是完全一樣的(除了數據),每一個都有它自己的服務器/實例和數據庫名稱。

由於職責分工,我不能開發的東西和部署,所以我沒有辦法驗收合格後碰這個腳本。我需要指導別人這樣做,如果他/她將需要更換的[legacyserver]每次出現。[數據庫],出錯的機率非常高。

+0

在SQL 2000實例上有開發,接受和生產數據庫的全部功能嗎?所有三個數據庫的結構是否相同(相同的表格,視圖等)? – DMason

+0

完全相同的表格,視圖等不同的實例和數據。 我只能訪問開發和驗收。該腳本將由DBA使用生產服務器執行。 – LawfulHacker

+0

鏈接服務器的「Lazy Schema Validation」是否設置爲true?這在黑暗中有點跛腳,但值得嘗試。順便說一句,您需要Enterprise或Developer Edition才能使用此功能。 – DMason

回答

5

當您查詢

SELECT * FROM table 

它實際上是從鏈接服務器,而不是本地數據庫中獲取數據,您可以創建一個同義詞

CREATE SYNONYM [table] FOR [legacyserver].[database].[schema].[table] 

如果想改變數據庫,只是下降同義詞,創建一個新的與新的數據庫名稱。

DROP SYNONYM table; 
CREATE SYNONYM [table] FOR [legacyserver].[anotherdatabase].[schema].[table] 

您的查詢語句不變。

編輯DROPCREATE SYNONYM聲明有點誤導。你不需要自己做。這是部署中的一次工作。只需創建一個Post-Deployment腳本,即可創建所有同義詞和參數化鏈接的服務器名稱和數據庫名稱。代碼如:

IF EXISTS (SELECT * FROM sys.synonyms WHERE name = 'table1') 
BEGIN 
DROP SYNONYM table1 
END 
EXEC('CREATE SYNONYM table1 FOR ' + '$(LinkedServerName).$(DBName).[dbo].[Table1]') 

請注意,它使用SQLCMD語法。 要求操作在不同的環境中更改參數。

+0

它給我現在有同樣的問題,幷包括新的。我將需要更改創建同義詞的腳本,並且會刪除大量新對象。已更新 – LawfulHacker

+0

。請檢查。 – qxg

+0

我會給你一個加號,並接受你的回答,因爲它給了我一個好主意。實際上,我查詢'[legacyserver]。[database]。[schema]。[sysobjects]'並檢索所有表,並將其中的每個表的同義詞放在新數據庫中稱爲legacy的模式中,導入數據並刪除它們包含所有內容的傳統模式,使我的新數據庫變得乾淨。 – LawfulHacker

相關問題