我們的SSDT數據庫項目包含一個表,其中包含一個計算列,可根據客戶要求採用多種形式之一。我試圖弄清楚如何管理這個計算列,以便我們仍然可以使用發佈功能而不需要將所有人的列都還原爲默認值。SSDT項目中的模式對象的條件編譯
我試圖完成可以通過以下無效 T-SQL代碼來解釋:
CREATE TABLE dbo.Customer
(
Id INTEGER,
Region INTEGER,
Name VARCHAR(50),
AccountNumber AS dbo.FormatAccountNumber(Id, Region)
)
CREATE FUNCTION [dbo].[FormatAccountNumber]
(
@Id INTEGER,
@Region INTEGER
)
RETURNS VARCHAR(20)
AS
BEGIN
IF '$(AccountType)' = 'Regional'
RETURN CONVERT(VARCHAR, @Region) + '-' + CONVERT(VARCHAR, @Id)
IF '$(AccountType)' = 'Merged'
RETURN CONVERT(VARCHAR, @Region * 100000 + @Id)
IF '$(AccountType)' = 'Flat'
RETURN CONVERT(VARCHAR, @Id)
END
這當然不行,因爲$(AccountType)
SQLCMD變量可以」不能在函數內部使用,並且在運行時無法正確設置。我也試圖把SQLCMD有條件周圍的整個功能:
IF '$(AccountType)' = 'Flat'
CREATE FUNCTION ...
但是這將產生錯誤「CREATE FUNCTION必須是批處理的語句。」
有沒有辦法在SSDT項目中進行任何形式的模式條件編譯?如果沒有,那麼在SSDT發佈過程中維護這種可自定義的字段有什麼選擇?
這是我們所傾向的解決方案,但是這不會迫使我們在每個部署中都刪除並重新創建該功能,即使這些功能沒有改變?我們最感興趣的部分SSDT項目是自動生成的「sql diff」部署腳本。 –
的確如此。我已將上述SQL修改爲僅在每個部署中使用ALTER對象。它不會給你完全相同的結果(例如,sql diff部署),但至少不需要每次都刪除它。 –
我想我會將條件中的SQL重構爲自己的腳本文件,並讓部署後腳本調用該文件。 –