【发布时间】:2021-08-04 04:00:55
【问题描述】:
我正在使用 SQL Server 2017。我正在 Azure Data Studio 中将整个 MySQL Sakila 数据库创建到我的数据库中。我目前坚持使用功能,特别是以下行:
DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;
这是我的尝试,没有我提到的那一行,查询似乎没有错误。
CREATE FUNCTION inventory_held_by_customer (@p_inventory_id INT)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @v_customer_id INT;
DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL; ---if the query finds no rows at all, then return a null
SELECT @v_customer_id=customer_id
FROM rental
WHERE return_date IS NULL
AND inventory_id = @p_inventory_id;
RETURN(@v_customer_id);
END;
这是 MySQL 的原始查询
CREATE DEFINER=`root`@`localhost` FUNCTION `inventory_held_by_customer`(p_inventory_id INT) RETURNS int(11)
READS SQL DATA
BEGIN
DECLARE v_customer_id INT;
DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;
SELECT customer_id INTO v_customer_id
FROM rental
WHERE return_date IS NULL
AND inventory_id = p_inventory_id;
RETURN v_customer_id;
END
提前致谢,感谢您的帮助!
【问题讨论】:
-
在 SQL Server 中,如果没有找到结果,将自动返回 null。但是,您有一个缺陷,您返回的是从表中选择的单个标量值。但是,如果
select返回多行怎么办?您将返回 1 个随机值。 -
非常感谢 Dale 告诉我查询存在缺陷。如果我返回一个表而不是一个 INT,那会解决吗?再次感谢!
-
只有您知道该函数试图实现什么以及如何使用它。您希望返回单个值吗?还是值表?
-
@Stu OP 正在尝试从 MySQL 转换为 SQL Server。
-
你打算如何使用函数的输出?一个表值函数似乎更合适,即返回一个符合条件的 ID 列表?
标签: mysql sql sql-server tsql