首页 > 解决方案 > SQL Server 系统版本表的变量 History_Retention_Period

问题描述

我希望能够为不同的环境设置不同的保留期,而无需为每个环境设置单独的脚本。我目前在 Visual Studio 中使用 SQL Server 数据库项目并创建一个部署后脚本来处理这个问题。

我已经设置了一个 Sql cmd 变量,该变量基于我正在使用的发布配置文件传递给一个名为 RetentionPolicyMonths 的变量:

  <ItemGroup>
    <SqlCmdVariable Include="RetentionPolicyMonths">
      <Value>36</Value>
    </SqlCmdVariable>
  </ItemGroup>

然后我想在我的部署后脚本中使用它来设置每个表的保留策略:

DECLARE @RetentionPolicyMonths int = CAST('$(RetentionPolicyMonths)' AS int)

ALTER TABLE [benefits].[Address] SET (SYSTEM_VERSIONING = ON (History_Retention_Period = @RetentionPolicyMonths MONTHS));

我的问题是,它目前不允许我像现在这样使用变量设置 History_Retentin_Period 属性。这是我目前看到的错误:

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near '@RetentionPolicyMonths'.Expecting -, ID, INT, or NUMERIC

我可以使用变量来设置它,还是只能提供数字?

标签: sql-servertemporal-tablessql-server-data-project

解决方案


ALTER TABLE选项的语法如下

[, HISTORY_RETENTION_PERIOD =
                          {
                              INFINITE | number {DAY | DAYS | WEEK | WEEKS
                  | MONTH | MONTHS | YEAR | YEARS }
                          }
                          ]

所以看起来你不能在该语句中使用变量。

如果您使用动态 SQL,您仍然可以传入参数

DECLARE @sql nvarchar(max) = '
ALTER TABLE [benefits].[Address] SET (SYSTEM_VERSIONING = ON (History_Retention_Period = ' + CAST(@RetentionPolicyMonths AS varchar(10)) + ' MONTHS));
';

EXEC (@sql);

但是您似乎实际上是在将值插入到查询中(这传递参数不同),所以您也可以直接插入它,只要您确定它的准确性。

ALTER TABLE [benefits].[Address] SET (SYSTEM_VERSIONING = ON (History_Retention_Period = '$(RetentionPolicyMonths)' MONTHS));

推荐阅读