2015-09-16 27 views
1

這可能有點奇怪的問題,但是如果鏈接服務器是Oracle或SQL服務器,我將如何能夠確定存儲過程內部?以編程方式確定鏈接服務器是Oracle還是SQL Server

爲了給出一點上下文,我們有一個應用程序在生產中查詢包含PID(個人身份信息)的鏈接服務器(Oracle服務器,不是我們的),因此我們不允許在我們的開發中使用它和測試環境。我們很遺憾不能建立我們自己的Oracle服務器,所以在我們的環境中進行測試時,我們已經設置了一個SQL Server實例作爲鏈接服務器,並將其中的數據模擬起來。

對於我們查詢的99%,這不會造成任何問題,只是一個與這條線在它

WHERE LAST_MODIFIED > TO_DATE(''''' + CONVERT(nvarchar(24), @maxImageDate, 120) + ''''',''''YYYY-MM-DD HH24:MI:SS'''') 

我們在開發和測試環境通常手動修改爲

WHERE LAST_MODIFIED > ''''' + CONVERT(nvarchar(24), @maxImageDate, 120) + ''''' 

我的第一個想法是嘗試一個只能在oracle上運行的查詢:

SELECT 1 FROM OPENQUERY(LinkedServerName, ''SELECT * FROM v$version'') 

in a TRY/CATCH並運行不同的查詢(如果失敗,但會導致事務在捕獲錯誤後仍不可承諾)

我們開始使用octodeploy進行自動部署,我們可以讓觸手代理運行SQL腳本根據環境修改SP,但寧願將所有的邏輯和代碼保存在SP中,因此在回購中,但如果我們不能找出另一種解決方案,我們可能會採取這種做法。

任何幫助,將不勝感激

+2

檢查'SELECT * FROM sys.servers' – lad2025

+0

如何在你的MSSQL開發服務器上創建一個名爲TO_DATE()的函數,它只返回第一個參數。 –

+0

這可能正是我需要的lad2025。謝謝,我會測試並看看我什麼時候有機會 –

回答

2

我同意@ lad2025,我也會使用sys.servers(不知道爲什麼他/他沒有發佈答案)。

雖然你可能能夠通過現有的數據,以確定哪些服務器是甲骨文存在(如provider列)我將設置product列自己最大的靈活性(如當企業規則發生變化,他們有一個Oracle服務器設置,他們想要從dev查詢)。

例如,使用sp_addlinkedserver時,只需設置@srvproduct到「甲骨文」或「doNotQueryFromDevOrTest」或任何你想使用,然後把在你的進程內的IF-THEN。

請注意,文檔說,鏈接到Oracle時,您可以在此列中使用任何內容(最多128個字符)。快速測試似乎證實了這一點,即使對於SQL Server也是如此。

我不知道任何定義爲返回產品名稱或RDBMS版本的ANSI-SQL查詢。

此外,如果您有其他選項,我不會推薦使用try-catch作爲正常控制流。與if-then相比,異常處理通常很昂貴。

0

lad2025給你一個很好的答案,但如果你沒有訪問sys.servers你可以嘗試


If (Select @@SERVERNAME) = 'YourProdServerNameHere' 
Begin 
-- Do prod server stuff 
End 
Else 
Begin 
-- Do dev and test server stuff 
End 

0

使用此SELECT:

select product from sys.servers where srv_name='LINKED_SERVER_NAME' 

產品退貨MSSQL用於Microsoft SQL Server的SQL Server

希望它有幫助。

相關問題