2014-12-04 15 views
0

我們有Dev,Uat和Live環境。對於每個環境,我們有相同的存儲過程的不同版本。對於每個環境,存儲過程都是從同一個名稱爲「CMS」的數據庫目錄運行的。在每種情況下,所調用的sql只在服務器名稱上有所不同。例如,在UAT代碼看起來像這樣(簡化):根據調用環境,我們如何獲得相同的存儲過程代碼來調用不同的數據庫服務器?

INSERT INTO UAT.ABC.[dbo].NOTE (ID, [TEXT]) 
    VALUES (2, 'Just a note') 

活看起來像這樣的代碼(簡化):

INSERT INTO Live.ABC.[dbo].NOTE (ID, [TEXT]) 
    VALUES (2, 'Just a note') 

我們想只寫存儲過程一次,能夠部署相同的存儲過程,以便在我們的示例中執行插入語句時指向正確的服務器。我們希望避免使用動態sql。有沒有辦法將參數傳遞給存儲過程,告訴它要使用哪個服務器?這可以通過使用帶腳本變量的sqlcmd來實現,如果是這樣,那又如何?有沒有一個簡單的方法做到這一點沒有動態SQL或腳本變量?

編輯的SQL Server 2014

六個單獨的實例 - 3用於爲每個代碼環境中調用代碼和3每個環境被調用。

+0

UAT,Dev和Live是否有單獨的SQL Server實例? – BateTech 2014-12-04 17:03:36

+0

SQL Server 2014的六個獨立實例 - 每個調用代碼的環境3個,每個環境3個代碼被調用。 – CarneyCode 2014-12-04 17:10:15

+0

好的,在這種情況下UAT,Dev和Live是關聯的服務器嗎? – BateTech 2014-12-04 17:11:01

回答

0

我假設有3個「相同」代碼的數據庫副本,或者說,代碼應該是相同的。刪除硬編碼的數據庫引用,存儲過程將在它所在的數據庫的上下文中運行。 通過對數據庫引用進行硬編碼,使自己的生活變得艱難。

而你回答你自己的問題。如果你願意這樣做,那麼你必須使用動態SQL。

+0

調用代碼與其調用的代碼不在同一臺服務器上。每個調用代碼的環境有6個不同的SQL Server 2014實例,每個環境3個代碼被調用。 – CarneyCode 2014-12-04 17:10:43

+0

然後你別無選擇,只能使用動態sql – Jeremy 2014-12-04 17:14:00

+0

只是好奇你爲什麼不能讓存儲過程在你實際插入的服務器上插入數據。它使維護和生活變得更加容易。 – Jeremy 2014-12-04 17:15:30

0

在所有情況下保持鏈接服務器名稱相同,只需更改鏈接服務器指向正確實例的位置的定義

所以使用這樣的:

INSERT INTO MyAppLinkedServer.ABC.[dbo].NOTE (ID, [TEXT]) 
    VALUES (2, 'Just a note') 

在UAT,MyAppLinkedServer將指向UAT SQL服務器。 在Dev中,MyAppLinkedServer將指向DEV SQL服務器。

下面是如何設置鏈接服務器的例子:

EXEC master.dbo.sp_addlinkedserver @server = N'MyAppLinkedServer', @srvproduct=N'MyAppLinkedServer', @provider=N'SQLNCLI', @datasrc=N'ActualServerNameGoesHere', @catalog=N'ABC' 
+0

如果它沒有打破使用鏈接服務器當前名稱的所有內容,這將有所幫助。 – CarneyCode 2014-12-04 17:18:30

+0

當您在dev/uat/live之間移動時,所有使用鏈接服務器的當前名稱都會中斷,對吧? – BateTech 2014-12-04 17:19:45

+0

對於「用戶當前鏈接服務器名稱的所有內容」,您的Dev環境是否會使用UAT或Live鏈接服務器?對於其他情況也是如此?如果這些現有查詢是相同的,那麼在您的開發環境中,將您的DEV/UAT/LIVE鏈接服務器設置爲* all *指向Dev SQL Server(對於UAT/Live環境也是如此)。這樣,你使用哪一個並不重要。這不是很好,但這將解決使用硬編碼鏈接服務器名稱的傳統查詢的問題。 – BateTech 2014-12-04 18:15:11

0

簡短的回答是不使用任何鏈接的服務器,而是創造的任何條目爲每個環境,在准入會對主機文件針對每個環境的不同IP映射。

相關問題