Я работаю над назначением, и мне нужно написать хранимую процедуру в 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;
Любые идеи, что я пропустил? Есть ли какое-нибудь обходное решение?
Является ли @ArtistLastName в таблице Artist? Также очень хорошая идея полностью квалифицировать ваши объекты (т. Е. Database.schema.Artist вместо просто Artist). –
Есть ли у вас какие-либо данные в ** Trans ** table? Ошибка говорит о том, что в ** Trans ** нет записи, которая имеет * SalesPrice * NULL и WorkId равную любому значению, указанному выше в * @ WorkID *. – CynicalSection
LastName находится в таблице Artist – Mac