Сохраненная процедура, которая вычисляет количество строк с одинаковым номером и помещает это значение в другую таблицу

Мне нужна помощь с назначением, где я должен создать хранимую процедуру в SQL. Я новичок в SQL, и это первый курс по базам данных, который я беру. Я использую SQL Server Managment Studio 2012.

У меня есть 2 стола, настольная книга и настольная книга. Табличная книга имеет три столбца: isbn (первичный ключ), title и nrOfCopies. В таблице bookcopy также есть три столбца: штрих-код (первичный ключ), status и isbn (внешний ключ, который ссылается на столбец isbn в таблице book).

Таким образом, назначение состоит в том, чтобы создать хранимую процедуру для определенного значения isbn (количество строк с одинаковым номером isbn), который обновляет столбец nrOfCopies в книге book. Число строк для определенного номера isbn будет значением в столбце nrOfCopies для этого номера isbn в таблице книги.

Я пытался сделать это так:

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 ответа

Решение

Если я правильно понимаю, вам нужна процедура, которая подсчитывает количество копий for a specific isbn number в таблице bookcopy, а затем обновляет таблицу book с этим количеством.
Если это так, то это должно выглядеть примерно так.
(Я просто использовал 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'

Я хотел бы предложить что-то вроде этого:

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 или это могло бы обновить только значение для speciffc '@isbn', которое передается через параметр.

OR оператор в WHERE Согласно моему опыту, это может привести к некоторым проблемам с производительностью. Этого можно избежать, используя два SP (один с и без @isbn параметр), или с помощью IF пункт внутри процедуры.

Надеюсь это поможет!

Это поможет вам получить результат;

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
Другие вопросы по тегам