Сохраненная процедура, которая вычисляет количество строк с одинаковым номером и помещает это значение в другую таблицу
Мне нужна помощь с назначением, где я должен создать хранимую процедуру в 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