【发布时间】: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