【问题标题】:Migrating from MySQL to SQL Server, How to Implement Triggers从 MySQL 迁移到 SQL Server,如何实现触发器
【发布时间】: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 那么我们在同一行插入代码,否则我们不写引用。这是一个可能更明确的例子:

Example

我真诚地尝试了很多东西,似乎最接近我要求的是这个(当然,它不起作用):

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


【解决方案1】:

好的,我想我们必须使用触发器(巨大的叹息)。

以下是您在 SQL Server 中的操作方式:

CREATE TRIGGER <your schema>.<your table>_Insert ON <your schema>.<your table>
INSTEAD OF INSERT
AS
BEGIN
  INSERT INTO <your schema>.<your table> (<your other columns>,<myColumnReferenceCode>) 
    SELECT
      <your other columns>
     ,CASE
        WHEN <myColumnContainingBoolean> = 1 THEN FORMAT(GETDATE(),'yyyyMMdd') + 'indice'
        ELSE <myColumnReferenceCode>
      END 
    FROM
      inserted 
END
GO

如果您使用的是自动递增 (IDENTITY) 列,请确保将其从触发器内的插入列表中删除。

其他观察:您可能只是将&lt;myColumnReferenceCode&gt; 设为日期并存储GETDATE() 并获得相同的功能,但我不知道您的所有情况。

【讨论】:

  • 谢谢,我能够毫无问题地重现和实施查询。但它不起作用,因为在我的上下文中,请求(由 PowerApps 自动生成)似乎是更新而不是插入(抱歉信息不正确,我无法控制 PowerApps 表单,我一直误导),我收到以下错误消息:imgur.com/yf0Qw1V。看来解决它的唯一方法是修改表单本身,不幸的是我仍然没有这样做的权利。
  • 在空中挥舞着拳头祝你的冒险好运。
猜你喜欢
  • 2012-07-07
  • 2011-06-17
  • 2014-05-24
  • 2016-06-09
  • 2011-06-23
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 2011-10-07
相关资源
最近更新 更多