0

我几乎完成了我的第一个任务,但最后一个问题让我很难过。

它问:

生成故障产品报告,显示 2010 年 11 月 7 日因外部损坏而退回的产品

预期的输出是:

有缺陷的产品报告

--------------------------------------

产品名称:办公桌

客户名称:Simon, Kernel

原因:外部损坏

(1 行受影响)

---报告结束---

我现在发现了 SQL,PRINT我似乎几乎把它全部归结为 T:

DECLARE @ProductName varchar(30)
SET @ProductName =(SELECT MIN(Products.ProductName) FROM Products)

DECLARE @CustomerName varchar(75)
SET @CustomerName =(SELECT MIN(Customers.FirstName+', '+Customers.Surname) 
FROM Customers,CustomerReturns,Products
WHERE CustomerReturns.ReturnDate='2012/07/11'
AND Products.ProductID=CustomerReturns.ProductID
AND Customers.CustomerID=CustomerReturns.CustomerID)

DECLARE @Reason varchar(30)
SET @Reason =(SELECT MIN(CustomerReturns.Reason) 
FROM CustomerReturns,Products,Customers
WHERE CustomerReturns.Reason='Damaged Exterior')

PRINT 'FAULTY PRODUCT REPORT';
PRINT '';
PRINT '---------------------';
PRINT 'Product Name: '+@ProductName;
PRINT 'Customer Name: '+@CustomerName;
PRINT 'Reason: '+@Reason;
PRINT '';
PRINT '---END OF REPORT---';

我的输出:

有缺陷的产品报告

--------------------------------------

产品名称:办公桌

客户名称:Simon, Kernel

原因:外部损坏

---报告结束---

如您所见,我仍然缺少:

(1 行受影响)

我怎样才能让它看起来没有当然作弊和只是打印它?(因为无论返回多少结果,它都会保持不变)

编辑:

我发现这样做:SELECT @ProductName...产生受影响的 1row(s),这是正确的吗?:

PRINT 'FAULTY PRODUCT REPORT';
PRINT '';
PRINT '---------------------';
PRINT 'Product Name: '+@ProductName;
PRINT 'Customer Name: '+@CustomerName;
PRINT 'Reason: '+@Reason;
SELECT @ProductName,@CustomerName,@Reason
PRINT '';
PRINT '---END OF REPORT---';

EIDT2:

将其更改为:

DECLARE @PName varchar(35)
DECLARE @CName varchar(75)
DECLARE @RName varchar(75)
SELECT @PName=Products.ProductName,
 @CName=Customers.FirstName+', '+Customers.Surname ,
 @RName=CustomerReturns.Reason

FROM Products,Customers,CustomerReturns

WHERE CustomerReturns.ReturnDate='2012/09/28'
AND CustomerReturns.Reason='Damaged Exterior'
AND Products.ProductID=CustomerReturns.ProductID
AND Customers.CustomerID=CustomerReturns.CustomerID
PRINT @PName
PRINT @CName
PRINT @RName

但仍然不影响行的东西

感谢您的帮助

4

2 回答 2

2

查询后查看使用该@@ROWCOUNT功能。此函数返回受最后一条语句影响的行数。在此处阅读更多相关信息。

使用上面的第二次编辑,您可以执行以下操作:

DECLARE @PName varchar(35) 
DECLARE @CName varchar(75) 
DECLARE @RName varchar(75)
DECLARE @rowCount int 
SELECT @PName=Products.ProductName, 
 @CName=Customers.FirstName+', '+Customers.Surname , 
 @RName=CustomerReturns.Reason 

FROM Products,Customers,CustomerReturns 

WHERE CustomerReturns.ReturnDate='2012/09/28' 
AND CustomerReturns.Reason='Damaged Exterior' 
AND Products.ProductID=CustomerReturns.ProductID 
AND Customers.CustomerID=CustomerReturns.CustomerID

SET @rowCount = @@ROWCOUNT

PRINT @PName 
PRINT @CName 
PRINT @RName 
--Use @rowCount in your report.

请注意,您必须在执行查询后立即获取行数。这样,无论你得到多少行,你都会得到正确的数字——避免你提到的“作弊”场景。

希望这可以帮助。

于 2012-08-20T21:00:48.687 回答
1

SELECT, UPDATE,INSERTDELETE都使用 Messages 选项卡来输出受操作影响的行数。(NOCOUNT标志可能会影响这一点,但我还没有做任何研究来支持这一点)。

您已经确定SELECT语句是(1 rows(s) affected)文本输出出现的一种方式;但是,生成该输出的方法不止一种。

您当前的查询似乎符合作业要求的大部分内容 - 这可能是将其带到您的讲师并要求澄清他们想要什么的好时机。

于 2012-08-20T19:48:25.207 回答