SQL Server:存储过程语法mishap

时间:2014-10-17 15:18:05

标签: sql sql-server stored-procedures join

这是我必须执行的 CREATE PROCEDURE sp_SalesByYr 1。参数:OrderYear 2。按地区

显示Total的{​​{1}}销售额

Year是数据库。

  • Sales.SalesOrderHeader表Sales
  • Sales.SalesTerritory表

这是我的看法:它会导致错误代码 -

  

必须声明标量变量@Result

补救措施是什么? (输出的数据类型应为Money而不是Integer)

AdventureWorks2012

2 个答案:

答案 0 :(得分:1)

在END语句后你可能只需要一个“GO”。 CREATE PROC包含GO之前的所有内容,因此包括您的测试语句。

我做了一些更改,但做了一些假设 - 也许会有所帮助。

  • 将SUM(@SalesYTD)更改为SUM(TotalDue),以便计算参数中年份的销售额
  • 假设您正在计算尝试按地区查询
  • ,则从地区移除OUTPUT
  • 将查询年份更改为2006年而不是2002年,因为2002年没有在AdventureWorks中销售
  • 将年份的WHERE子句更改为YEAR(OrderDate)= @OrderYear
  • 添加到WHERE子句,因此也可以选择过滤区域

最终代码成了:

CREATE PROC csp_SalesByYr
    @OrderYear DateTime, 
    @SalesYTD Money OUTPUT,
    @Territory Nvarchar(50) = NULL
AS
BEGIN
    SET NOCOUNT ON

    SET @SalesYTD = (
        SELECT SUM(TotalDue)
        FROM Sales.SalesOrderHeader SO
            INNER JOIN Sales.SalesTerritory T
                ON SO.TerritoryID = T.TerritoryID
        WHERE YEAR(SO.OrderDate) = @OrderYear
            AND (@Territory IS NULL OR T.Name = @Territory)
    ) 
END
GO
DECLARE @Result Money
EXEC    csp_SalesByYr 2006, @Result OUTPUT, 'Northeast'
PRINT  @Result

答案 1 :(得分:0)

CREATE PROC sp_SalesByYr     @OrderYear INT 如 开始     设置NOCOUNT ON;     SET SELECT a.TerritoryID Territory,                 SUM(a.TotalDue)SalesByTy                 FROM Sales.SalesOrderHeader a                 在哪里DatePart(YY,a.OrderDate)= @OrderYear
                GROUP BY a.TerritoryID

END

EXEC sp_SalesByYr'2002'OUTPUT