0

我正在处理几个练习题,我遇到了这个问题,我在尝试执行程序时不断收到错误消息

消息 156,级别 15,状态 1,第 1 行
关键字“程序”附近的语法不正确。”

有人可以帮忙吗?

编写一个UpdateTitle接受所有Title表列并使用这些值更新标题的过程。引发以下错误消息: ISBN 不存在 类别和/或出版商代码无效。

Create PROCEDURE UpdateTitle (@ISBN char(10), @SuggestedPrice smallmoney,@NumberInStock smallint,@PublisherCode int,@CategoryCode int)
AS
BEGIN
IF @ISBN is null or @CategoryCode is null or @PublisherCode is null
BEGIN
 RAISERROR ('ISBN,CategoryCode, or PublisherCode is not valid please enter valid data',16,1)
END
ELSE
BEGIN    
 IF (SELECT COUNT(*) FROM Title WHERE ISBN = @ISBN) = 0
 BEGIN
    RAISERROR ('ISBN does not exist.',16,1)
 END
 ELSE
 BEGIN
    SELECT 'Table Sucessfully Updated.';
    UPDATE Title 
    SET SuggestedPrice = @SuggestedPrice
    WHERE ISBN = @ISBN;

    BEGIN
     IF (SELECT COUNT(*) FROM Title WHERE ISBN = @ISBN) = 0
     BEGIN
    RAISERROR ('ISBN does not exist.',16,1)
 END
 ELSE
 BEGIN
    SELECT 'Table Sucessfully Updated.';
    UPDATE Title 
    SET NumberInStock = @NumberInStock
    WHERE ISBN = @ISBN;
  END

          BEGIN
     IF (SELECT COUNT(*) FROM Title WHERE ISBN = @ISBN) = 0
     BEGIN
    RAISERROR ('ISBN does not exist.',16,1)
 END
 ELSE
 BEGIN
    SELECT 'Table Sucessfully Updated.';
    UPDATE Title 
    SET PublisherCode = @PublisherCode
    WHERE ISBN = @ISBN;
  END
          BEGIN
     IF (SELECT COUNT(*) FROM Title WHERE ISBN = @ISBN) = 0
     BEGIN
    RAISERROR ('ISBN does not exist.',16,1)
 END
 ELSE
 BEGIN
    SELECT 'Table Sucessfully Updated.';
    UPDATE Title 
    SET CategoryCode = @CategoryCode
    WHERE ISBN = @ISBN;
  END

 END
END
END
END
END
END
GO

然后

 Execute Procedure UpdateTitle @ISBN ='1021031040', @suggestedproce ='40' , @NumberInStock ='10', @PublisherCode = '200', @CategoryCode = '1'
4

1 回答 1

1
Execute Procedure UpdateTitle ...

应该:

EXEC dbo.UpdateTitle ...

其他一些评论:

  • ISBN 不再限于 10 个字符(如果您相信 WikiPedia,此更改发生在 2007 年)。
  • 创建或引用对象时始终使用模式前缀
  • 您只需要检查 ISBN 是否有效一次。而且您不应该使用计数恕我直言,特别是因为 - 大概 - 这是关键,无论如何它只能返回 0 或 1。
  • 您不应选择“更新成功”然后执行更新。在告诉用户更新成功之前,您应该确保更新成功。
  • 也没有理由将其分成多个更新。
  • 请自由使用回车、缩进和空格。可读性的价值值得在输入时付出额外的代价(因为您只输入一次,但您会阅读多次)。
  • 用作RETURN;退出机制,这样您就不必嵌套IFELSE多次。
  • 始终SET NOCOUNT ON;在程序开始时使用。
  • 您可能希望自定义消息以告诉用户哪些参数无效。
  • 哦,是的,请使用分号终止 statements 来证明您的代码的未来

这是一个更简洁的版本,可以满足您的所有要求:

CREATE PROCEDURE dbo.UpdateTitle
  @ISBN           CHAR(10), 
  @SuggestedPrice SMALLMONEY,
  @NumberInStock  SMALLINT,
  @PublisherCode  INT,
  @CategoryCode   INT
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @msg VARCHAR(255);

  IF @ISBN IS NULL OR @CategoryCode IS NULL OR @PublisherCode IS NULL
  BEGIN
    SELECT @msg = 'The following parameter(s) were invalid:'
      + CASE WHEN @ISBN IS NULL THEN ' @ISBN' ELSE '' END 
      + CASE WHEN @CategoryCode IS NULL THEN ' @CategoryCode' ELSE '' END 
      + CASE WHEN @PublisherCode IS NULL THEN ' @PublisherCode' ELSE '' END;

    RAISERROR (@msg, 11, 1);
    RETURN;
  END

  IF NOT EXISTS (SELECT 1 FROM dbo.Title WHERE ISBN = @ISBN)
  BEGIN
    SET @msg = 'ISBN %s does not exist.';
    RAISERROR(@msg, 11, 1, @ISBN);
    RETURN;
  END

  BEGIN TRY
    UPDATE dbo.Title
      SET SuggestedPrice = @SuggestedPrice,
          NumberInStock  = @NumberInStock,
          PublisherCode  = @PublisherCode,
          CategoryCode   = @CategoryCode
      WHERE ISBN = @ISBN;

    SELECT 'Update successful.';
  END TRY
  BEGIN CATCH
    SET @msg = ERROR_MESSAGE();
    RAISERROR(@msg, 11, 1);
  END CATCH
END
GO
于 2013-04-03T00:23:42.270 回答