尝试使用参数和多个连接创建存储过程

Posted

技术标签:

【中文标题】尝试使用参数和多个连接创建存储过程【英文标题】:Trying to create stored procedure with parameter and multiple joins 【发布时间】:2021-04-30 10:16:52 【问题描述】:

我正在尝试使用一个参数创建一个存储过程并连接三个表:OrdersOrdersOrdered_ProductsOrdered_ProductsProductsProducts。我想要所有表中没有匹配表的列。该参数在 java 中用于让客户能够根据他们的用户 ID 搜索订单。

这是我想出的:

CREATE PROCEDURE sp_seeOrder
    @user_id
AS
    SELECT 
        O.order_id, O.order_quantity, O.user_id, O.Status, O.order_date, 
        O_P.orderID, O_P.product_code, 
        P.product_id, P.product_name, P.price
    FROM 
        Orders AS O
    FULL JOIN 
        Ordered_Products ON O.order_id = O_P.orderID,
    RIGHT JOIN 
        Products P ON O_P.product_code = P.product_id
    WHERE 
        user_id = @user_id;

我收到多个错误:

消息 156,级别 15,状态 1,过程 sp_seeOrder,第 4 行 [批处理开始行 213] 关键字“SELECT”附近的语法不正确。

消息 156,级别 15,状态 1,过程 sp_seeOrder,第 9 行 [批处理开始行 213] 关键字“RIGHT”附近的语法不正确。

我做错了什么?

【问题讨论】:

用您正在使用的数据库标记您的问题。您可能还应该非常清楚您希望代码做什么。我也强烈建议您不要使用存储过程进行简单查询。首选视图或表函数(假设您的数据库支持它们)。 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_ 并使用其他东西作为前缀 - 或者根本没有前缀! 感谢您的回答戈登。数据库是本地的,这是一个学校作业,所以我不能标记它。我希望能够从通过它们之间的键连接的三个表中获取列中的信息。我将其更改为视图并删除了参数,但仍然出现一个错误(我编辑了我的原始帖子) 这一点Procedure sp_seeOrder告诉我们,你认为你在做的并不是你发布的。 对不起,我编辑了这个问题,因为有人建议我将其更改为视图,而且我在键盘上有点快。但我得到了修复语法的答案 【参考方案1】:

在@user_id 参数中放置一个数据类型。我假设它是一个 INT,因为它是一个 ID。并删除额外的,在“ON O.order_id = O_P.orderID”之后。更正后的查询应如下所示:

CREATE PROC sp_seeOrder
@user_id INT
AS
SELECT 
    O.order_id, O.order_quantity, O.user_id, O.Status, O.order_date, O_P.orderID, 
    O_P.product_code, P.product_id, P.product_name, P.price
FROM Orders AS O
FULL JOIN Ordered_Products AS O_P
    ON O.order_id = O_P.orderID
RIGHT JOIN Products P
    ON O_P.product_code = P.product_id
WHERE user_id = @user_id;

【讨论】:

以上是关于尝试使用参数和多个连接创建存储过程的主要内容,如果未能解决你的问题,请参考以下文章

使用连接创建存储过程?

sqlserver怎么创建存储过程

雪花存储过程多语句列表参数

mysql存储过程一个参数有多个逗号分割

mysql中如何创建存储过程

sql server 存储过程传参问题. 一个参数如何可以输入多个参数值