2014-11-18 2 views
1

Я работаю над назначением, и мне нужно написать хранимую процедуру в Microsoft SQL Server. Точный код приведен в книге, и я проверил его несколько раз, чтобы убедиться, что я ничего не пропустил, но я не получаю правильные результаты, когда я его запрашиваю.Сохраненная процедура не работает правильно

Вот код процедуры:

CREATE PROCEDURE InsertCustomerWithTransaction 
     @NewCustomerLastName   char(25), 
     @NewCustomerFirstName   char(25), 
     @NewCustomerAreaCode   char(3), 
     @NewCustomerPhoneNumber   char(8), 
     @NewCustomerEmail    varchar(100), 
     @ArtistLastName     char(25), 
     @WorkTitle      char(25), 
     @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 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 ' Customer Last Name = ' + @NewCustomerLastName 
      PRINT ' Customer First Name = ' + @NewCustomerFirstName 
      PRINT '' 
      PRINT '************************************************' 
     RETURN 
     END 

     ELSE 
     BEGIN TRANSACTION 
       INSERT INTO Customer 
     (LastName, FirstName, AreaCode, PhoneNumber, Email) 
     VALUES(@NewCustomerLastName, @NewCustomerFirstName, @NewCustomerAreaCode, @NewCustomerPhoneNumber, @NewCustomerEmail) 

     SELECT @CustomerID = CustomerID 
     FROM Customer 
     WHERE LastName = @NewCustomerLastName 
     AND FirstName = @NewCustomerFirstName 
     AND AreaCode = @NewCustomerAreaCode 
     AND PhoneNumber = @NewCustomerPhoneNumber 
     AND Email = @NewCustomerEmail 

     SELECT @ArtistID = ArtistID 
     FROM Artist 
     WHERE LastName = @ArtistLastName 

IF @ArtistID is null 
    Begin 
    PRINT '************************************************' 
    PRINT '' 
    PRINT ' Invalid ArtistID' 
    PRINT '' 
    PRINT '************************************************' 
    ROLLBACK TRANSACTION 
    RETURN 
END 

SELECT @WorkID = WorkID 
FROM 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 

    SELECT @TransactionID = TransactionID 
    FROM 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 Trans 
     SET DateSold = getDate(), 
      SalesPrice = @TransSalesPrice, 
      CustomerID = @CustomerID 
     WHERE TransactionID = @TransactionID 

     INSERT INTO CUSTOMER_ARTIST_INT(CustomerID, ArtistID) 
      VALUES (@CustomerID, @ArtistID) 
     END 

     COMMIT TRANSACTION 

     BEGIN 


      PRINT '************************************************' 
      PRINT '' 
      PRINT ' The 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 

Когда я пытаюсь проверить его, используя следующий код, который также был дан в книге, которую я получаю сообщение «Invalid TransactionID» из процедуры. Согласно книге, клиент должен быть успешно добавлен.

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; 

Любые идеи, что я пропустил? Есть ли какое-нибудь обходное решение?

+0

Является ли @ArtistLastName в таблице Artist? Также очень хорошая идея полностью квалифицировать ваши объекты (т. Е. Database.schema.Artist вместо просто Artist). –

+1

Есть ли у вас какие-либо данные в ** Trans ** table? Ошибка говорит о том, что в ** Trans ** нет записи, которая имеет * SalesPrice * NULL и WorkId равную любому значению, указанному выше в * @ WorkID *. – CynicalSection

+0

LastName находится в таблице Artist – Mac

ответ

2

Вы должны использовать SalesPrice IS NULL, не SalesPrice = NULL

SalesPrice = NULL не выдаст ошибку, но она также не будет соответствовать, как вы думаете.

+0

Так оно и было. Типо в книге, я думаю. Благодаря! – Mac

0

Вы можете использовать SalesPrice = NULL но вам нужно установить ANSI_NULL OFF по умолчанию это ON

SET ANSI_NULLS OFF 

SalesPrice = NULL 

SET ANSI_NULLS ON 

, когда вы установите его OFF

это означает, что стандарт ISO отрабатывался средства

= и <> следует использовать для нулевого сравнения.

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