2014-02-12 15 views
0

我有這樣的事情:我應該使用動態SQL或有另一種方式

AND t2.AUD_ORGID IN (SELECT Org_ID 
        FROM [development_company_database].[dbo].fx_Rights_ORGIDs(@ORG_ID)) 

我工作的數據庫A和fx_Rights_ORGIDs是數據庫B.我應該使用動態SQL連接到它(我真的不希望)

Dymamic:

SET @MANDB = (SELECT DatabseDB FROM SERVER) 
SET @MANOwner = (SELECT DatabaseOwner FROM SERVER) 
SET @serverMan = (Select @DatabseDB +'.'+ @DatabaseOwner) ... 

...AND t2.AUD_ORGID IN (SELECT Org_ID FROM ['+ @COMPANYDB +'].['+ @COMPANYOwner +'].fx_Rights_ORGIDs('+ CAST(@ORG_ID AS VARCHAR) + ')) 

...EXEC sp_executesql @Tsql2 

只是想知道有沒有辦法解決辦法,我不想硬編碼這樣的數據庫:

[development_company_database].[dbo]. 
+0

爲什麼你不想硬編碼數據庫名稱?我可以看到你希望如何避免在代碼中使用數據庫名稱,但是使用動態SQL來解決這個問題會導致代碼變得混亂(可能更慢)。如果您需要更換數據庫名稱,請執行簡單的搜索並替換。 – SchmitzIT

+0

@SchmitzIT:我可以將連接細節分配給@variables並使用它們嗎?類似於@ @ serverMan.fx_Rights_ORGIDs' – TheUser

+1

是的,你可以做到這一點。但是,您必須將查詢存儲在SQL字符串中。即'SELECT @sql ='SELECT * FROM'+ @database +'。' + @owner +'.tableName''。儘管萬一出現了問題,但它會使調試過程複雜化。我通常最終使用'PRINT @ sql'來生成一個可執行語句,然後可以將其複製/粘貼到新窗口以測試結果集。 – SchmitzIT

回答

0

對於另一種觀點,我會說有幾個因素我會在這裏考慮。

  1. 數據庫名稱和位置是否一致?如果是這樣,你是唯一運行它的人,對可移植腳本進行硬編碼並不是那麼糟糕。但是,個人而言,如果數據庫名稱發生更改,我寧願只更改腳本頂部的一個條目,並確保它始終保持一致。 另一種方法是使用SSMS 2012中的模板功能。這實質上與Ctrl + H的功能相同。 我想這取決於你計劃在將來改變這個腳本多少。

  2. 這是一個存儲過程嗎?如果你運行它很多,那麼它可能應該是,如果是這樣,硬編碼數據庫名稱並不理想。更好地聲明變量並在運行時設置它們。

我使用動態SQL運行了很多腳本而沒有性能問題。唯一可以確定的方法是比較兩者的表現,並在那裏得出你自己的結論。

相關問題