我們在這裏專門使用存儲過程,這引發了一些小問題。我們交叉引用兩個不同的數據庫,如dev中的dbdev..table1,qa中的dbqa..table1以及生產中的dbprod..table1。如何將數據庫名稱作爲SP中的變量?
因此,每次我們部署到不同的環境時,我們必須搜索並從dbdev替換爲dbqa或dbprod。
有沒有辦法使用同義詞或任何SQL服務器機制來解決問題?
我們在這裏專門使用存儲過程,這引發了一些小問題。我們交叉引用兩個不同的數據庫,如dev中的dbdev..table1,qa中的dbqa..table1以及生產中的dbprod..table1。如何將數據庫名稱作爲SP中的變量?
因此,每次我們部署到不同的環境時,我們必須搜索並從dbdev替換爲dbqa或dbprod。
有沒有辦法使用同義詞或任何SQL服務器機制來解決問題?
使用SQLCMD變量,這是由.SQL配置腳本的SQLCMD部署支持,以及VSDB項目。所以,你的供應腳本的樣子:
create procedure usp_myProc
as
select .. from [$(crossdb)]..table1;
go
當在生產中部署它運行sqlcmd /E /I provisoning.sql /v crossdb=dbprod
,而QA的部署將通過sqlcmd /E /I provisioning.sql /v crossdb=dbqa
來完成。見Using sqlcmd with Scripting Variables。
作爲一個方面說明,我正在研究一個項目,該項目允許從.Net SqlClient(SqlConnection,SqlCommand)使用sqlcmd變量:dbutilsqlcmd項目。
它也被同一作者請求[這裏](http://connect.microsoft.com/SQLServer/feedback/details/288421/allow-create-synonym-for-database)。他必須*真的*想要這個功能。 :-) – 2010-08-26 18:15:26
對,數據庫名稱應該是一樣的。它應該是不同的服務器。如果你的dev和qa與生產環境在同一個sql server中,你會錯過很多好處。 – 2010-08-26 18:20:27
動態SQL
(原諒潛在的錯別字,但概念是存在的)
Declare @dbname nvarchar(255), @sql nvarchar(max)
set @dbname = 'db1'
Set @sql = 'Select * From ' + @dbname + '.dbo.table1'
exec sp_executesql @sql
看起來好像發現和替換是一個比這更好的選擇,因爲它很混亂,並會繼續生產。此外,如果您嘗試在用戶定義的函數中使用它,則會遇到問題。 – 2010-08-26 18:18:53
SQL Server 2005支持的同義詞,因此您可以創建synonym1指在開發環境到dbdev..table1,並在產品環境中使用dbprod..table1。你的SP(可能是視圖)只是對同義詞進行操作。
更新:
的最簡單的方式創建同義詞:
exec sys.sp_MSforeachtable
'print ''CREATE SYNONYM '' + REPLACE(''?'', ''].['', ''].[syn_'') +
'' FOR [my_database].?
GO'''
(有GO之前斷行)
運行和粘貼結果存入新的查詢窗口。
你知道嗎有一種簡單的方法來編寫一個sql來動態地爲每個對象定義一個同義詞嗎? – Haoest 2010-08-26 23:37:28
您可以將數據庫名稱作爲存儲過程的參數,然後使用動態SQL構建查詢。
例:
CREATE PROC MyStoredProcedure @DBName VARCHAR(50)
AS
DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'SELECT * FROM ' + @DBName + '.dbo.table1'
EXEC sp_executesql @SQL
,那麼只需在調用存儲過程與相應的DB名稱:
EXEC MyStoredProcedure 'dbdev'
SQLCMD變量必須在運行時指定,是否正確?目前不支持運行SQLCMD腳本,並在繼續之前提示用戶輸入信息?我問,因爲Oracle的SQLPlus已經支持了一段時間的功能(對我來說是9i)... – 2010-08-26 20:04:10
SQLCMD變量必須在啓動命令中指定,如'/ v'參數,或者它們可以作爲環境變量提供,或者它們可以是用':setvar'在腳本中設置。沒有提供變量值的交互方式。 – 2010-08-26 22:00:13