【问题标题】:SQL Syntax errors with commas带有逗号的 SQL 语法错误
【发布时间】:2018-05-27 23:29:07
【问题描述】:

完成新手尝试学习。

当“OrderDate”被更新/输入时,我想让“Sales”表填充“Finance”表,但是我无法插入多个列。

   CREATE TRIGGER SalesOrderDateTrigger
   ON [dbo].[Sales]
   AFTER INSERT
   AS
   BEGIN
   SET NOCOUNT ON;

   DECLARE @OrderDate Date

   SELECT @OrderDate = INSERTED.OrderDate FROM INSERTED

  IF @OrderDate > 0
  BEGIN

  INSERT INTO Finance 
  (Quote, Customer, Project_Name, [Value], 
  POC_Name_#1, POC_Number_#1, POC_Email_#1, 
  POC_Name_#2, POC_Number_#2, POC_Email_#2,
  Comment, [DA Link])
  SELECT (INSERTED.Quote, INSERTED.Customer, INSERTED.Project_Name, 
  INSERTED.[Value], 
  INSERTED.POC_Name_#1, INSERTED.POC_Number_#1, INSERTED.POC_Email_#1, 
  INSERTED.POC_Name_#2, INSERTED.POC_Number_#2, INSERTED.POC_Email_#2,
  INSERTED.Comment, INSERTED.[DA Link])
  FROM INSERTED

  END


 END

感谢您的阅读。

【问题讨论】:

  • 哪个 dbms?????????????????这是提问时最重要的信息。
  • 您不需要SELECT 中的 ()。应该是SELECT x, y, z,而不是SELECT (x, y, z)
  • 您可能想要SELECT @OrderDate = min(OrderDate) FROM inserted; 或将WHERE OrderDate > 0 添加到INSERT 本身。

标签: sql database trigger.io eventtrigger database-trigger


【解决方案1】:

您的方法存在一些问题..

您并不总是以“数据块”的方式看待这个问题。当然,您一次只能插入一行,但实际上可以同时向表中插入多行。发生这种情况时,inserted 伪表将有不止一行,因此您不能从中选择唯一的订单日期,并将其放入单个变量 @orderdate。避免使用 sqlserver 触发器进行任何类型的“逐行”思考; sqlserver服务器端编程的设计意图是始终基于集合;您在触发器中编写的任何内容都应该一次处理从零到数百万行的任何内容,而不是一次处理一行

我不太确定您将日期与 0 比较的那一行试图达到什么目的

您随后运行插入,该插入有效地将 Order 表中的数据插入到 Finance 表中。没有计算新的或不同的数据,也没有从其他地方引入,这使我相信订单和财务共享大量列,具有相同的数据。在数据库设计方面,这是一个糟糕的规范化策略;如果财务表复制订单表,它可能不应该存在。实际上,如果您的业务逻辑是 Orders 表中具有非 null OrderDate 的条目实现了财务表中的条目,那么实际上 Finance 可能只是基于简单查询的VIEW

SELECT blahblah FROM orders WHERE orderdate IS NOT NULL

【讨论】:

  • 好吧,不同的观点......你只是用唤醒锤击中了我。最好的一点我实际上知道如何写。 Tbh 我期待着像你这样的人过来用另一种方法给我一巴掌。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多