2010-08-26 58 views
0

我們在這裏專門使用存儲過程,這引發了一些小問題。我們交叉引用兩個不同的數據庫,如dev中的dbdev..table1,qa中的dbqa..table1以及生產中的dbprod..table1。如何將數據庫名稱作爲SP中的變量?

因此,每次我們部署到不同的環境時,我們必須搜索並從dbdev替換爲dbqa或dbprod。

有沒有辦法使用同義詞或任何SQL服務器機制來解決問題?

回答

3

使用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項目。

+0

SQLCMD變量必須在運行時指定,是否正確?目前不支持運行SQLCMD腳本,並在繼續之前提示用戶輸入信息?我問,因爲Oracle的SQLPlus已經支持了一段時間的功能(對我來說是9i)... – 2010-08-26 20:04:10

+0

SQLCMD變量必須在啓動命令中指定,如'/ v'參數,或者它們可以作爲環境變量提供,或者它們可以是用':setvar'在腳本中設置。沒有提供變量值的交互方式。 – 2010-08-26 22:00:13

1

編號

無法爲數據庫創建同義詞。不過,這是一個popular request

是不是真的有必要重命名您的數據庫爲dbdev,dbqa, dbprod等?

+1

它也被同一作者請求[這裏](http://connect.microsoft.com/SQLServer/feedback/details/288421/allow-create-synonym-for-database)。他必須*真的*想要這個功能。 :-) – 2010-08-26 18:15:26

+1

對,數據庫名稱應該是一樣的。它應該是不同的服務器。如果你的dev和qa與生產環境在同一個sql server中,你會錯過很多好處。 – 2010-08-26 18:20:27

1

動態SQL

(原諒潛在的錯別字,但概念是存在的)

Declare @dbname nvarchar(255), @sql nvarchar(max) 
set @dbname = 'db1' 

Set @sql = 'Select * From ' + @dbname + '.dbo.table1' 
exec sp_executesql @sql 
+0

看起來好像發現和替換是一個比這更好的選擇,因爲它很混亂,並會繼續生產。此外,如果您嘗試在用戶定義的函數中使用它,則會遇到問題。 – 2010-08-26 18:18:53

2

SQL Server 2005支持的同義詞,因此您可以創建synonym1指在開發環境到dbdev..table1,並在產品環境中使用dbprod..table1。你的SP(可能是視圖)只是對同義詞進行操作。

更新:

最簡單的方式創建同義詞:

exec sys.sp_MSforeachtable 
    'print ''CREATE SYNONYM '' + REPLACE(''?'', ''].['', ''].[syn_'') + 
    '' FOR [my_database].? 
    GO''' 

(有GO之前斷行)

運行和粘貼結果存入新的查詢窗口。

+0

你知道嗎有一種簡單的方法來編寫一個sql來動態地爲每個對象定義一個同義詞嗎? – Haoest 2010-08-26 23:37:28

0

您可以將數據庫名稱作爲存儲過程的參數,然後使用動態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' 
相關問題