我需要帮助完成一项任务,我应该在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)。
有人可以通过指出我能解决这个问题来帮助我吗?
答案 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