【发布时间】:2020-11-11 00:04:16
【问题描述】:
所以我有这个为 MySQL 环境编写的触发器,现在我需要将它转移到 SQL Server 环境。
由于不熟悉 Transact SQL,我在从一个转换到另一个或创建一个等价物时遇到了一些麻烦。这是简化的查询:
CREATE TRIGGER <myTrigger> BEFORE INSERT ON <myTable>
IF NEW.<myColumnContainingBoolean> = TRUE THEN
SET NEW.<myColumnReferenceCode> = CONCAT(YEAR(NOW()),MONTH(NOW()),DAY(NOW()), 'indice');
ENDIF;
目标是根据查询中包含的布尔值的值添加参考编号(今天写入的日期 yyyymmdd + 'indice'),以总结,如果在 INSERT 时,布尔值的值为 TRUE 那么我们在同一行插入代码,否则我们不写引用。这是一个可能更明确的例子:
我真诚地尝试了很多东西,似乎最接近我要求的是这个(当然,它不起作用):
CREATE TRIGGER <myTrigger>
ON <myTable>
AFTER INSERT
AS
BEGIN
IF <myColumnContainingBoolean>
SET <myColumnReferenceCode> = CONCAT(YEAR(GETDATE()),MONTH(GETDATE()),DAY(GETDATE()), 'indice');
FROM inserted
END
GO
【问题讨论】:
-
一个简单的
FORMAT(getdate(),'yyyymmd')+'indice'会生成你想要的字符串。您可以将其用作列的DEFAULT,例如DEFAULT (case theBoolean when 1 then FORMAT(getdate(),'yyyymmd')+'indice' else null end) -
这个特定实例看起来不像是触发器的最佳用途。您是否考虑过使用计算列或将逻辑合并到启动插入的过程中?
-
你可以使用
CASE在默认值中。 -
@bbaird : 谢谢,很遗憾我此时无法控制启动插入的过程,我不知道计算列的存在,我会看看。
-
@PanagiotisKanavos :我已经尝试了您的解决方案,这是错误消息:在此上下文中不允许使用名称
。有效表达式是常量、常量表达式和(在某些情况下)变量。不允许使用列名。
标签: mysql sql-server tsql