【问题标题】:Stored Procedure error SQL Server 2014存储过程错误 SQL Server 2014
【发布时间】:2015-06-14 04:51:28
【问题描述】:

我在使用 SQL 中运行的存储过程时遇到了一些问题。这是我正在上的一门课,存储过程来自教科书,但是教科书的 SQL 代码中有很多错误,所以如果这里也是这种情况,我也不会感到惊讶。我问过教授,他似乎也很难弄清楚。

这是我使用的存储过程,由 SQL Server Management Studio 的“创建到”函数生成:

USE [VGA]
GO

/****** Object:  StoredProcedure [dbo].[InsertCustomerWithTransaction]    Script Date: 4/8/2015 7:55:00 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[InsertCustomerWithTransaction]
    @NewCustomerLastName    CHAR(25),
    @NewCustomerFirstName   CHAR(25),
    @NewCustomerAreaCode    CHAR(3),
    @NewCustomerPhoneNumber CHAR(8),
    @NewCustomerEmail       VARCHAR(100),
    @ArtistLastName         CHAR(25),
    @WorkTitle              CHAR(35),
    @WorkCopy               CHAR(12),
    @TransSalesPrice        NUMERIC(8,2)

AS
    DECLARE @RowCount       AS Int,
            @ArtistID       AS Int,
            @CustomerID     AS Int,
            @WorkID         AS Int,
            @TransactionID  AS Int

    SELECT  @RowCount = COUNT(*)
    FROM    dbo.CUSTOMER
    WHERE   LastName = @NewCustomerLastName
        AND FirstName = @NewCustomerFirstName
        AND AreaCode = @NewCustomerAreaCode
        AND PhoneNumber = @NewCustomerPhoneNumber
        AND Email = @NewCustomerEmail

    IF (@RowCount > 0)
        BEGIN
            PRINT '****************************************************'
            PRINT ''
            PRINT '     The Customer is already in the database.    '
            PRINT ''
            PRINT '     CustomerLastName = '+@NewCustomerLastName
            PRINT '     CustomerFirstName = '+@NewCustomerFirstName
            PRINT ''
            PRINT '****************************************************'
        END

        ELSE
            BEGIN TRANSACTION
                INSERT INTO dbo.CUSTOMER
                    (LastName, FirstName, AreaCode, PhoneNumber, Email)
                    VALUES
                    (@NewCustomerLastName, @NewCustomerFirstName, @NewCustomerAreaCode, @NewCustomerPhoneNumber, @NewCustomerEmail)
                SELECT @CustomerID = CustomerID
                FROM dbo.CUSTOMER
                WHERE   LastName = @NewCustomerLastName
                    AND FirstName = @NewCustomerFirstName
                    AND AreaCode = @NewCustomerAreaCode
                    AND PhoneNumber = @NewCustomerPhoneNumber
                    AND Email = @NewCustomerEmail
        SELECT  @ArtistID = ArtistID
        FROM    dbo.ARTIST
        WHERE   LastName = @ArtistLastName

        IF @ArtistID IS NULL
            BEGIN
                PRINT '****************************************************'
                PRINT ''
                PRINT '     Invalid ArtistID    '
                PRINT ''
                PRINT '****************************************************'
                ROLLBACK TRANSACTION
                RETURN
            END

        SELECT  @WorkID = WorkID
        FROM    dbo.WORK
        WHERE   ArtistID = @ArtistID
            AND Title = @WorkTitle
            AND Copy = @WorkCopy

        IF  @WorkID IS NULL
            BEGIN
                PRINT '****************************************************'
                PRINT ''
                PRINT '     Invalid WorkID  '
                PRINT ''
                PRINT '****************************************************'
                ROLLBACK TRANSACTION
                RETURN
            END
        ELSE
            BEGIN
                PRINT '****************************************************'
                PRINT ''
                PRINT '     WorkID = '+CONVERT(CHAR(6), @WorkID)
                PRINT ''
                PRINT '****************************************************'
            END

        SELECT  @TransactionID = TransactionID
        FROM    dbo.TRANS
        WHERE   WorkID = @WorkID
            AND SalesPrice = NULL

        IF  @TransactionID IS NULL
            BEGIN
                PRINT '****************************************************'
                PRINT ''
                PRINT '     Invalid TransactionID   '
                PRINT ''
                PRINT '****************************************************'
                ROLLBACK TRANSACTION
                RETURN
            END

        BEGIN
            UPDATE  dbo.TRANS
            SET     DateSold = GETDATE(),
                    SalesPrice = @TransSalesPrice,
                    CustomerID = @CustomerID
            WHERE   TransactionID = @TransactionID
            INSERT INTO dbo.CUSTOMER_ARTIST_INT (CustomerID, ArtistID)
                VALUES (@CustomerID, @ArtistID)
        END

    COMMIT TRANSACTION
        BEGIN
            PRINT '****************************************************'
            PRINT ''
            PRINT '     The new Customer is now in the database.    '
            PRINT ''
            PRINT '     Customer Last Name  = '+@NewCustomerLastName
            PRINT '     Customer First Name = '+@NewCustomerFirstName
            PRINT ''
            PRINT '****************************************************'

            PRINT '****************************************************'
            PRINT ''
            PRINT '     Transaction complete.   '
            PRINT ''
            PRINT '     TransactionID   = '+CONVERT(CHAR(6), @TransactionID)
            PRINT '     ArtistID        = '+CONVERT(CHAR(6), @ArtistID)
            PRINT '     WorkID          = '+CONVERT(CHAR(6), @WorkID)
            PRINT '     Sales Price     = '+CONVERT(CHAR(12), @TransSalesPrice)
            PRINT ''
            PRINT '****************************************************'

            PRINT '****************************************************'
            PRINT ''
            PRINT '     New CUSTOMER_ARTIST_INT row added.  '
            PRINT ''
            PRINT '     ArtistID    = '+CONVERT(CHAR(6), @ArtistID)
            PRINT '     CustomerID  = '+CONVERT(CHAR(6), @CustomerID)
            PRINT ''
            PRINT '****************************************************'
        END
GO

这是我正在运行的代码:

EXEC    InsertCustomerWithTransaction
        @NewCustomerLastName = 'Gliddens',
        @NewCustomerFirstName = 'Melinda',
        @NewCustomerAreaCode = '360',
        @NewCustomerPhoneNumber = '765-8877',
        @NewCustomerEmail = 'Melinda.Gliddens@somewhere.com',
        @ArtistLastName = 'Sargent',
        @WorkTitle = 'Spanish Dancer',
        @WorkCopy = '588/750',
        @TransSalesPrice = 350.00;

当我运行代码时,它可以正常工作,直到以

开头的部分
SELECT  @TransactionID = TransactionID

此时它给了我错误“Invalid TransactionID”。由于输入需要 WorkID 并且 SalesPrice 列为 NULL,因此我添加了一些代码来给我 WorkID,而输出是正确的 WorkID。 screenshot 我进入数据库并仔细检查了该行中的 SalesPrice 列是否为 NULL,确实如此。 screenshot 但是由于某种原因,存储过程找不到正确的 TransactionID,即使我可以在表中手动找到它。有人可以帮我弄清楚我在这里做错了什么吗?谢谢!

【问题讨论】:

  • 除非课程的目的之一是调试存储过程,否则您应该获得教科书的退款
  • 尼克,你不是在开玩笑。我确保在进行课堂复习时发表评论说教科书很糟糕。

标签: sql sql-server tsql stored-procedures ssms


【解决方案1】:

这是IS NULL not = NULL

在这一点

SELECT  @TransactionID = TransactionID
        FROM    dbo.TRANS
        WHERE   WorkID = @WorkID
            AND SalesPrice = NULL

【讨论】:

  • 谢谢!那让我发疯了。查看我的代码,我什至在几行之后正确地做了类似的事情。嗯,这就是为什么它被称为“学习”。
  • 完全没有问题。有时很难发现这些类型的问题,只需要第二双眼睛来检查它。祝全班同学好运。
【解决方案2】:

在 SQL SERVER 中,您应该使用“IS NULL”而不是“= NULL”来检查 null 值。

SELECT  @TransactionID = TransactionID
FROM    dbo.TRANS
WHERE   WorkID = @WorkID
    --AND SalesPrice = NULL
      AND SalesPrice is NULL

再试一次。 希望对您有所帮助。

【讨论】:

    【解决方案3】:

    CRLast86....只是想指出,= Null 和 Is Null 都是有效的。 IS NULL 是 ANSI 标准,但 MS-SQL 允许 = Null,除非您更改了 ANSI_NULLS 模式,正如您所做的那样,在顶部附近使用 SET ANSI_NULLS ON 语句。最佳实践说,使用 SET ANSI_NULLS ON,这样它就不会让你使用 = Null。因此,将来当您看到 = Null 并且它正在工作时,您将有条件地知道两者都是有效的。在 SET ANSI_NULLS ON 上进行搜索,您将了解整个故事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 2018-10-04
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      相关资源
      最近更新 更多