【问题标题】:Stored procerudure that calculate number of rows with same number and place that value to other table计算具有相同数量的行数并将该值放置到其他表的存储过程
【发布时间】:2017-06-28 11:21:35
【问题描述】:

我需要帮助我完成一项应该在 SQL 中创建存储过程的任务。我是 SQL 新手,这是我学习的第一门数据库课程。我正在使用 SQL Server Management Studio 2012。

我有 2 张桌子、桌子书和桌子书本。表书有三列,isbn(主键)、title 和 nrOfCopies。 bookcopy 表也有三列,barcode(主键)、status 和 isbn(引用表 book 中 isbn 列的外键)。

因此,任务是为特定的 isbn 值(具有相同 isbn 编号的行数)创建一个存储过程,以更新 book-table 中的 nrOfCopies-column。特定 isbn 编号的行数将是 book-table 中该 isbn 编号的 nrOfCopies 列中的值。

我试着这样做:

CREATE PROCEDURE spNrOfBooks
AS
BEGIN
    DECLARE @calcNr AS INT
    SET @calcNR = (SELECT COUNT(isbn) FROM bookcopy)
    UPDATE book SET nrOfCopies = @calcNr WHERE isbn LIKE (SELECT isbn FROM bookcopy)
END

当我执行此过程时,我收到一条错误消息 (Msg 512)。

有人可以通过指出我可以做些什么来解决这个问题来帮助我吗?

【问题讨论】:

  • 我怀疑 Msg 512 是该错误消息的唯一文本。完整显示
  • 你需要先阅读一门关于sql的课程。你的程序有太多问题。开始解释有很多问题
  • 内部查询(SELECT isbn FROM bookcopy)带来了所有的行并用在一个类似的表达式中
  • “所以任务是为特定的 isbn 值创建一个存储过程”。这表明您的存储过程应该带一个参数。
  • 你能推荐一些好的教程吗?我可以在哪里阅读你的意思?非常感谢您的 cmets!

标签: sql sql-server stored-procedures sql-server-2012


【解决方案1】:

如果我理解你是正确的,你需要一个程序来计算表 bookcopy 中的副本数 for a specific isbn number,然后用该计数更新表。
如果是这样的话,它应该看起来像这样。
(我只是将 varchar(100) 用于 isbn,因为我不知道您的 isbn 是如何定义的)

CREATE PROCEDURE spNrOfBooks (@isbn varchar(100))
AS
BEGIN
    SET NOCOUNT ON

    UPDATE book 
    SET    nrOfCopies = (select count(*) from bookcopy where isbn = @isbn)
    WHERE  isbn = @isbn
END

你可以这样使用它

execute spNrOfBooks '12345678901234567'

【讨论】:

  • 非常感谢GuidoG!它完全按照我的意愿工作:)
  • @JulijusErgül 如果我的回答对您有帮助,请考虑支持并接受它作为答案
【解决方案2】:

我会建议这样的事情:

CREATE PROCEDURE spNrOfBooks
    @isbn VARCHAR(17)
AS
BEGIN
    UPDATE B
    SET B.nrOfCopies = (
        SELECT COUNT(*) FROM bookcopy bc
        WHERE bc.isbn=B.isbn
    )
    FROM book B
    WHERE @isbn IS NULL OR B.isbn=@isbn
END;
GO

该过程可以更新所有nrOfCopies,也可以只更新通过参数提供的特定“@isbn”的值。

根据我的经验,WHERE 子句中的 OR 运算符最终可能会导致一些性能问题。这可以通过使用两个 SP(一个带一个不带@isbn 参数)或在过程中使用IF 子句来避免。

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    这会让你得到需要的结果;

    CREATE PROCEDURE spNrOfBooks
    
    AS
    
    UPDATE x 
    SET x.nrOfCopies=xx.CopiesCount
    from book x
    inner join
    (
    select
        CopiesCount=COUNT(1),
        isbn
    from
        bookcopy
    group by
        isbn
    )xx on x.isbn=xx.isbn
    

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      相关资源
      最近更新 更多