sql-server - 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));
推荐阅读
- php - 注意:尝试访问 null 类型值的数组偏移量
- c# - 我可以使用从 iOS 生成的公钥,在 c# 代码中加密数据并再次在 iOS 中解密加密数据(使用私钥)吗?
- git - 如何将文件重置为某个提交?
- c# - 如何通过 vb.net 让其他应用程序(计算器)在 winforms 中脱颖而出?
- signals - POSIX:为什么 sigwait 需要信号阻塞?
- php - PHP服务器退出信号:被杀死
- python - 为什么我不能将任何站点的所有标题(h1)打印到python
- angular - 如何以角度监视 MockNgRedux
- webpack - “你需要一个合适的加载器来处理这个文件类型......”,jsx
- java - 如何使用 IngestPlugin 在 Elasticsearch 中基于 IngestDocument 填充 indexableField