存储的procerudure,用于计算具有相同编号的行数,并将该值放入其他表

时间:2017-06-28 11:21:36

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

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

我有2张桌子,桌子书和桌面书。表格有三列,isbn(主键),title和nrOfCopies。 bookcopy表还有三列,条形码(主键),status和isbn(引用表格中的isbn-column的外键)。

因此,分配是为特定的isbn-value(具有相同isbn-number的行数)创建存储过程,以更新book-table中的nrOfCopies-column。特定isbn-number的行数将是book-table中该isbn-number的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)。

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

3 个答案:

答案 0 :(得分:0)

我会建议这样的事情:

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,或者它只能更新通过参数提供的specificfc'@ isbn'的值。

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

希望这有帮助!

答案 1 :(得分:0)

如果我理解你是正确的,你需要一个程序来计算表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'

答案 2 :(得分:0)

这可以为您提供所需的结果;

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