2017-02-17 85 views
0

我有一個應用程序,我用來連接到兩個不同的數據庫都有同步存儲過程和數據之外的東西。目前有這兩個不同的服務器,但我想把它們放入一個並重命名數據庫。但我在我的存儲過程的引用,例如數據庫的小問題,如何在存儲過程中引用數據庫名稱?

SELECT * FROM DatabaseA.Table1

我想控制從應用程序配置數據庫,所以我只需要更改連接字符串。

<add key="DatabaseName" value="DatabaseA"/> 
    or 
<add key="DatabaseName" value="DatabaseB"/> 
+2

不是100%確定我理解,但似乎同義詞可能在這裏幫助(從DatabaseA指向DatabaseB中的對象,反之亦然)。 – dean

+0

是的,改變連接工作,但一些存儲過程失敗,因爲它在where子句中的引用 – CodeBox

+1

你用兩個數據庫管理系統標記你的queestion:SQL Server和MySQL。你實際上使用了這兩種嗎? –

回答

-1

我過去所做的就是以下幾點:

CREATE PROCEDURE test 
    @dbName varchar(150) 
AS 
BEGIN 
    DECLARE @SqlStatement VARCHAR(MAX) 
    SELECT @SqlStatement = 'SELECT * FROM ' + @dbName + '.SchemaName.TableName' 
    EXEC sp_executesql @SqlStatement; 
END 
GO 

這基本上可以讓你在DBNAME傳遞給存儲過程,並使用它,但是你想。如果你希望它也是動態的,你甚至可以進一步傳遞表名。

與此有關的一個主要警告是,您需要確保防止SQL注入,並且沒有驗證完成此方法。

你可以給這篇文章,如果你感到困惑SQL注入讀:http://www.sommarskog.se/dynamic_sql.html

然而,對於你想達到什麼目的,我不相信,打針將是一個問題,這是隻是要記住。

更新1: 考慮,你不希望在一個變量,每個存儲過程來傳遞的,我能想到的唯一的其他選擇是做到以下幾點:

  • 創建不同的存儲過程(它引用你想要的不同數據庫)。
  • 然後從config中控制不同的存儲過程名稱。
+2

https://www.xkcd.com/327/ – gvee

+0

爲了OP的目的,儘管如此,似乎他並不希望存儲過程的用戶輸入(至少對於dbName)因此,這應該是足夠的 – Sanity1123

+0

通過這樣做會要求我改變所有的sp來傳遞附加參數 – CodeBox

0

要闡述我對同義詞評論 -

在DatabaseA,創建一個指向在DatabaseB對象,反之亦然synomyms,像這樣:

USE DatabaseA 
GO 
CREATE SYNONYM dbo.otherdb_table1 FOR DatabaseB.dbo.table1 
GO 
CREATE SYNONYM dbo.otherdb_table2 FOR DatabaseB.dbo.table2 
GO 
... 

USE DatabaseB 
GO 
CREATE SYNONYM dbo.otherdb_table1 FOR DatabaseA.dbo.table1 
GO 
CREATE SYNONYM dbo.otherdb_table2 FOR DatabaseA.dbo.table2 
GO 
... 

這樣,你總是可以參考表中數據庫像

select col1, col2 from dbo.otherdb_table1 

這將工作無論您在哪裏創建存儲過程,無論是DatabaseA還是DatabaseB,存儲過程都可以相同。

+0

感謝您的回覆,但如果存儲過程正在加入不同的數據庫? – CodeBox

相關問題