微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL Server 系统版本化表的变量 History_Retention_Period

如何解决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

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

解决方法

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));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。