将联接表的前10个SELECTED行(所有列)放入数组或变量表的SQL Server方法

时间:2018-11-05 03:13:30

标签: sql arrays sql-server stored-procedures

我正在努力弄清楚如何获取此存储过程以返回userId的所有约会(这是唯一需要的输入)。现在,它只返回一个约会。我希望它返回与userId关联的每个约会的所有5个属性(appointment_id,host_name,visit_start,visit_end和visit_location),每个约会用{}分隔。因此,如果访问者当天有5个约会,我希望返回所有5个约会(以及5个约会属性),每个单独的约会都包含在{}中。我还想处理userId没有与之关联的约会的情况。这段代码运行完美,但是,就像我说的那样,它只返回1个约会,而不是所有与userId关联的约会。我觉得我需要一个约会数组,尽管我不认为数组是SQL Server的一部分。我可能需要一个变量表,但是我不确定如何实现。我愿意接受任何建议。

CREATE PROCEDURE [dbo].[GetMeetings]
(

       @userId BIGINT,
       @appointmentId BIGINT OUTPUT,
       @hostName NVARCHAR(101) OUTPUT,
       @startTime DATETIMEOFFSET(7) OUTPUT,
       @endTime DATETIMEOFFSET(7)  OUTPUT,
       @location NVARCHAR(100) OUTPUT

)
AS
BEGIN
    SET NOCOUNT ON
       SELECT TOP 10
             @appointmentId = appointment_id,
             @hostName = host_name,
             @startTime = visit_start,
             @endtime = visit_end,
             @location = visit_location

       FROM
             dbo.reg_visits v1 INNER JOIN dbo.reg_visitors v2 on v1.reg_visit_id = v2.reg_visits_reg_visit_id
       WHERE
           v2.reg_visits_reg_visit_id IN 
       (SELECT TOP 10
             reg_visits_reg_visit_id AS id 
       FROM
             dbo.reg_visitors
       WHERE visitor_profile_visitor_id = @userId
       ORDER BY
             reg_visitors_id DESC) 
       AND v1.visit_start > GETDATE() ORDER BY v1.reg_visit_id desc
END

1 个答案:

答案 0 :(得分:1)

您的选择语句应该只是

CREATE PROCEDURE [dbo].[GetMeetings]
(

       @userId BIGINT
)
AS
BEGIN
    SET NOCOUNT ON
       SELECT TOP 10
             appointment_id,
             host_name,
             visit_start,
             visit_end,
             visit_location

我们想将其作为结果集而不是作为out参数返回。 OUTPUT参数实际上只能有一个值,因此这就是为什么您只返回一个约会的原因,并且它可能总是期望的10行中的最后一行。因此,也要删除所有OUTPUT参数,只需发送用户ID。