我们的 SSDT 数据库项目包括一个具有计算列的表,该计算列可以采用多种形式之一,具体取决于客户要求。我试图弄清楚如何管理这个计算列,以便我们仍然可以使用 Publish 功能,而无需将每个人的列恢复为默认值。
我试图完成的可以在以下无效的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 发布过程中维护这种可自定义的字段?