2015-04-09 7 views
2

У меня возникли проблемы с хранимой процедурой, которую я запускаю в SQL. Это для класса, который я беру, и хранимая процедура из учебника, но в учебнике было много ошибок в их SQL-коде, поэтому я не удивлюсь, если бы это было так. Я спросил профессора, и у него, похоже, тоже есть проблемы с этим.Ошибка хранимой процедуры SQL Server 2014

Вот хранимая процедура я использую, генерируемые с помощью 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 = '[email protected] 
      PRINT '  CustomerFirstName = '[email protected] 
      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 = '[email protected] 
      PRINT '  Customer First Name = '[email protected] 
      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 = '[email protected]', 
     @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, хотя я могу вручную найти ее в таблице. Может кто-нибудь помочь мне выяснить, что я делаю неправильно здесь? Спасибо!

+0

Если кто-либо из целей класса не отлаживает хранимые процедуры, вы должны получить возмещение в своем учебнике. –

+1

Ник, вы не шутите. Я убедился, что сделаю комментарий, когда я просмотрю класс, что учебник ужасен. – crlast86

ответ

1

IS NULL Это не = NULL

в этот бит

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

СПАСИБО! Это сводило меня с ума. Глядя на мой код, я даже сделал что-то подобное правильно несколько строк позже. Хорошо, вот почему это называется «обучение». – crlast86

+0

Нет проблем. Иногда бывает трудно определить эти проблемы, и все, что требуется, - это второй набор глаз, чтобы взглянуть на него. Удачи вам в остальном классе. –

0

В SQL SERVER, вы должны использовать "IS NULL" не "= NULL", чтобы проверить нулевое значение.

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

Повторите попытку. Надеюсь, это поможет.

0

CRLast86 .... просто хотел указать, что = Null и Is Null действительны. IS NULL является стандартом ANSI, но MS-SQL допускает = Null, за исключением случаев, когда вы изменили режим ANSI_NULLS, как и у вас, с инструкцией SET ANSI_NULLS ON вверху. По словам лучшей практики, используйте SET ANSI_NULLS ON, чтобы он не позволял вам использовать = Null. Итак, в будущем, когда вы увидите a = Null и он работает, вы будете знать, что условно оба действительны. Сделайте поиск по SET ANSI_NULLS ON, и вы получите всю длинную историю.

Смежные вопросы