2016-10-19 168 views
-1

我想创建一个存储过程spSumInvoices,它将接收感兴趣的供应商ID并打印出供应商的名称和他们所有发票的总和。为什么这是')'导致错误?

这是我使用的代码,不知道它的权利我是新来的存储过程:

IF OBJECT_ID ('spSumInvoices') IS NOT NULL 
    DROP PROC spSumInvoices; 
GO 

CREATE PROC spSumInvoices 
    @FindVen int, 
    @InvoiceTotal Money, 
    @VenName VARCHAR 
AS 
BEGIN 
    SELECT 
     @FindVen, SUM(InvoiceTotal) AS 'Total', @VenName 
    FROM 
     Vendors,Invoices 
    WHERE 
     Invoices.VendorID = @FindVen 
    GROUP BY 
     @InvoiceTotal 
END 

PRINT 'Vendor' + @VenName 
PRINT 'Has an invoice total of $' + CONVERT(VARCHAR,@InvoiceTotal); 

我得到这个错误:

Msg 164, Level 15, State 1, Procedure spSumInvoices, Line 15
Each GROUP BY expression must contain at least one column that is not an outer reference.

+0

您的'CONVERT'缺少目标数据类型参数。你应该完全删除它,因为你不需要它'VendorName'。 – Filburt

+0

如果我把一个数据类型,这将是varchar它给了我这个错误:名称“VenderName”是不允许在这种情况下。有效表达式是常量,常量表达式和(在某些情况下)变量。列名不被允许。 @Filburt –

+0

不应该'选择VenderName,SUM(InvoiceTotal)'......它不清楚'Vendername'的来源。 – Filburt

回答

0

回答这个问题是: {USE AP; IF OBJECT_ID('spSumInvoices')不为NULL DROP PROC spSumInvoices; GO

CREATE PROC spSumInvoices 
@FindVen int 



AS 
BEGIN 
DECLARE @VenName Varchar(50); 
SET @VenName =(SELECT VendorName FROM Vendors WHERE VendorID = @FindVen); 
DECLARE @InvoiceTotal money; 
SET @InvoiceTotal = (SELECT SUM(InvoiceTotal) FROM Invoices WHERE 
VendorID = @FindVen); 


SELECT @VenName,@InvoiceTotal 
FROM Vendors,Invoices 
WHERE Invoices.VendorID = @FindVen 

END 

PRINT 'Vendor ' + @VenName 
PRINT 'Has an invoice total of $' + CONVERT(VARCHAR,@InvoiceTotal); 
enter code here}