【发布时间】:2014-09-01 17:57:14
【问题描述】:
这是我的功能:
CREATE FUNCTION fu_order_customer_adress (@customer_ID INT)
RETURNS INT AS
BEGIN
RETURN (
SELECT c.adress_ID FROM customers AS c
JOIN orders AS o ON (c.customer_ID = o.customer_ID)
WHERE c.customer_ID = @customer_ID)
END
用于表orders的AFTER INSERT触发器,其结构如下(不含不重要的列):
orders (order_ID INT, customer_ID INT, employee_ID)
order_ID是主键,其他列是外键。
触发器如下所示:
CREATE TRIGGER tr_orders_insert ON orders
AFTER INSERT
AS
BEGIN
DECLARE @order_ID INT = (SELECT order_ID FROM INSERTED);
DECLARE @customer_ID INT = (SELECT customer_ID FROM INSERTED);
UPDATE orders
SET adress_ID = (SELECT dbo.fu_order_customer_adress(@customer_ID))
WHERE order_ID = @order_ID;
END
以下插入已编号,以便稍后轻松指出。
(1) 这适用于具有不同 customer_ID 的插入:
INSERT INTO orders(customer_ID, employee_ID)
VALUES (1, 1)
INSERT INTO orders(customer_ID, employee_ID)
VALUES (2, 2)
(2) 但是当插入已经使用customer_ID的订单时,插入会以错误结束:
INSERT INTO orders(customer_ID, employee_ID)
VALUES (1, 2)
我发现这是由触发器中使用的函数引起的,因为在这种情况下它什么也不返回。
我尝试将函数中使用的SELECT function 和SELECT 放入触发器中:
CREATE TRIGGER tr_orders_insert ON objednavka
AFTER INSERT
AS
BEGIN
DECLARE @order_ID INT = (SELECT order_ID FROM INSERTED);
DECLARE @customer_ID INT = (SELECT customer_ID FROM INSERTED);
SELECT c.adress_ID
FROM customers AS c
JOIN orders AS o ON (c.customer_ID = o.customer_ID)
WHERE c.customer_ID = @customer_ID)
SELECT dbo.fu_order_customer_adress(@customer_ID)
UPDATE orders
SET adress_ID = (SELECT dbo.fu_order_customer_adress(@customer_ID))
WHERE order_ID = @order_ID;
END
In (1) 都是SELECT 结果相同。
In (2) 是SELECT 结果正常,但SELECT function 什么也不返回。
我不明白出了什么问题...感谢您的帮助!
【问题讨论】:
标签: sql sql-server function triggers insert