解決SQL Project中Script遇到跨DB參照問題

做單一系統資料庫專案,透過SQL Project方式開發,基本上並無太大問題,但是,如果在企業內部時候,會遇到一個實務上問題是,當要把某一個系統的資料庫轉換變成SQL Project時候,裡面如果Script有參照到其他資料庫,或是你在A資料庫下寫View或是Store Procedure時必須參照到同一台Server不同DB抓資料(如果是Link Server可以參考這解決[點我],這時候在A資料庫專案終究會有問題出現,會發現你的Script出現紅色警告,甚至無法編譯成功。範例是當你在A DB的View用到B DB的Table

1
2
3
SELECT *
FROM A.dbo.XXX AS a LEFT OUTER JOIN
B.dbo.MMM AS b ON a.ID = b.ID

最簡單解決方式,當然也是把另一個DB也變成SQL Project,然後做Database Reference,但是,實務上要執行會是有相當難度

  • 第一:你可能只用到一個資料表,卻要把整個DB變成你的專案
  • 第二:DB Owner並不是你

所以,必須要有變相的做法來解決這問題,不然,在A資料庫的SQL Project將會無法編譯成功,又或是需要大費周章把有參照到資料庫都變成SQL Project

建立一個被參照DB的殼


在自己專案內,建立一個要參照B資料庫的專案檔,在專案檔下面建立要對應的Table

然後,在Table的欄位中,只要放入你所有需要的欄位就可以

設定SQL Project參照


建立好要被參照SQL Project後,就在原來SQL Project去參照它

然後就會跳出相關設定的屬性

  • 紅色框,就選擇剛剛要被參照的SQL Project名稱
  • 藍色框,則是透過變數方式去設定在A SQL Project要替代的變數,其中,Database Name如果SQL Project專案名稱與實際DB Name不同,這邊要換成實際DB Name,這樣在後續部署上才不會出問題,至於變數名稱就看自己喜好訂定

設定完成後,會多出一個Reference,這跟寫C#一樣,是參照不同Assemably的概念

透過變數方式,只要在後面有用到這個DB時候,都可以透過變數取代

所以,就可以把剛剛上面語法變成下面這樣,用[$(RefHR)]去代替B,就可以解決無法參照問題

1
2
3
SELECT *
FROM A.dbo.XXX AS a LEFT OUTER JOIN
[$(RefHR)].dbo.MMM AS b ON a.ID = b.ID

但是,這種做法透過New Schema Comparison去部署,也是可以的唷

因為,Visual Studio在幫你部署SQL Statement時候,自動把[$(RefHR)]變數至換成實際的值,所以,透過這樣做法也還是可以能用SQL Project做版控的,只是切記別真的把被參照的DB也部署到Server就好