【问题标题】:How to create stored procedure with print from 2 different tables?如何使用来自 2 个不同表的打印创建存储过程?
【发布时间】:2012-07-19 16:18:55
【问题描述】:

我在数据库中有 3 个表,1 个是瑜伽课,另一个是成员和它们之间的交集,我想创建一个存储过程来打印 指定 类的详细信息以及分配给班级的每个成员的姓名和联系电话。报告输出的格式应与以下内容相同:

YOGA CLASS REPORT:
___________________

Class ID: 1112
Week day:   Monday    [Time: 07:00:00]
Studio Number: 1

No.  Member Name         Contact Number
________________________________________
1    John Doe            +26 83 562 3953

到目前为止我有:

CREATE PROCEDURE sp_Report  
@classID SMALLINT  
AS  
  IF NOT EXISTS(SELECT * FROM class WHERE classID = @classID)      
  BEGIN  
     RAISERROR ('classID does not exist',16,1)  
     RETURN  
  END

  DECLARE @classWeekday VARCHAR(15)  
  DECLARE @classTime TIME  
  DECLARE @classStudioNo TINYINT

  SELECT @classWeekday = class.classWeekday, @classTime = class.classTime, 
         @classStudioNo = class.classStudioNo  
  FROM class  
  WHERE @classID = classID

  PRINT 'YOGA CLASS REPORT'  
  PRINT 'Class code:' +CAST(@classID AS VARCHAR)  
  PRINT 'Week day:' +@classWeekday +'[Time:' + CAST(@classTime AS VARCHAR)+ ']'   
  PRINT 'Studio Number' +CAST(@classStudioNo AS VARCHAR)  

我现在如何打印参加特定课程的所有成员?任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    这样的事情会给你参加每个班级的人......

    SELECT 
         c.MemeberID
         , m.MemberName
         , m.ContactNumber
    FROM 
         class c
         INNER JOIN members m ON
             c.MemberID = m.MemberID 
    WHERE c.classID = @classID
    

    看着这个Stack Overflow question,我想知道你为什么实际使用PRINT

    【讨论】:

    • 它用于课堂练习,必须像这样创建存储过程。
    【解决方案2】:

    您是否尝试过使用光标?

    PRINT 'YOGA CLASS REPORT' 
    
    DECLARE cClasses CURSOR FOR
    SELECT classWeekday, classTime, classStudioNo  
    FROM class  
    WHERE classID = @classID
    
    OPEN cClasses
    FETCH NEXT FROM cClasses INTO @classWeekday, @classTime, @classStudioNo
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
        PRINT 'Class code:' +CAST(@classID AS VARCHAR)  
        PRINT 'Week day:' +@classWeekday +'[Time:' + CAST(@classTime AS VARCHAR)+ ']'   
        PRINT 'Studio Number' +CAST(@classStudioNo AS VARCHAR)
    
    FETCH NEXT FROM cClasses INTO @classWeekday, @classTime, @classStudioNo
    END
    CLOSE cClasses
    DEALLOCATE cClasses
    

    这里有官方文档在 msdn DECLARE CURSOR SQL SERVER

    【讨论】:

    • 你在正确的轨道上,但他问的是如何打印学生,而不是班级。
    • 没错!也许我没有很好地阅读这个问题。无论如何,他可以使用 CURSOR 来完成这项工作。感谢@BertEvans 的评论
    • 我以前从未使用过游标,我对 sql 很陌生。我在问如何从参加查询的特定课程的 member 表中打印 memberName, memberTelephone,请记住并非所有成员都参加每一堂课。我会假设它必须在 WHILE 循环中并迭代和加入以检查哪些成员参加了 classID N。我需要帮助,因为我是 sql 新手,不知道从我已有的东西中去哪里。感谢您回复@Elwi
    • 两个表相交的字段名是什么?
    【解决方案3】:

    正如其他人所提到的,我很好奇您为什么要为此使用 print,但鉴于这是一个约束,您必须在连接中使用光标。下面是一些示例代码和一个工作示例。

    编辑:我只想补充一点,通常在使用 SQL 时,您会希望避免使用游标。 SQL 是一种基于集合的语言,游标是过程性的。因此,虽然我给出了一个使用游标的示例以满足必须打印每个结果的约束,但我不会在任何生产环境中这样做。

    declare @class table (classID int, className nvarchar(100))
    insert @class values (1,'TSQL'),(2,'SQL Server')
    declare @members table (memberID int, memberName nvarchar(100), contactNumber nvarchar(100))
    insert @members values (1, 'John Doe', '+26 83 562 3953'), (2, 'Bert Evans','+26 83 562 3954')
    declare @classmembers table (classID int, memberID int)
    insert @classmembers values (1,1),(1,2)
    
    declare attendees cursor for 
        select rsMembers.memberID, memberName, contactNumber
        from @members rsMembers
        inner join @classmembers rsClassMembers on rsClassMembers.memberID = rsMembers.memberID
        where rsClassMembers.classID = 1
        
    open attendees
    declare @number int, @name nvarchar(100), @contact nvarchar(100)
    fetch next from attendees into @number, @name, @contact
    while @@FETCH_STATUS = 0
    begin
    
        print cast(@number as nvarchar(100)) + ' ' + @name + ' ' + @contact
        fetch next from attendees into @number, @name, @contact
        
    end
    close attendees
    deallocate attendees
    

    Working example.

    【讨论】:

    • 感谢大家的帮助,其实我现在还在学习sql,我之所以用print是为了课堂练习,教我sql的老师都指定了这个存储过程必须使用印刷品,格式必须与我发布的相同(见上文)。
    • @Yi-NainChen NP,我认为你在某种程度上受到了限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多