必须声明作为过程参数的标量变量

Must declare the scalar variable which is a procedure parameter

我正在尝试创建一个不存在的过程。此过程采用 date 类型的参数:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'GetAllManualInsertionsFromDate')

CREATE PROCEDURE volumetrie.GetAllManualInsertionsFromDate
    @date date
AS
BEGIN
    SELECT i.Id, i.EntryDate, c.CustomerNumber, i.NbEnvelopes As envelope, i.NbBoxes As box,
            c.Name, YEAR(@date) As dateYear, MONTH(@date) As dateMonth, s.Raccourci as area
    FROM volumetrie.InsertionManuelle As i
        INNER JOIN dbo.Customers As c ON i.ClientId = c.CustId
        INNER JOIN dbo.Sites s ON i.SiteCode = s.CodeSite
    WHERE i.EntryDate >= @date
END

我在使用@date 参数的所有三个地方都出现错误:

Must declare the scalar variable @date

我在 BEGIN 关键字上还遇到另一个错误,这可能会导致另一个错误:

Incorrect syntax near 'BEGIN'. Expecting EXTERNAL.

你看到我哪里做错了吗?

IF  EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'GetAllManualInsertionsFromDate')
drop procedure GetAllManualInsertionsFromDate
go

CREATE PROCEDURE volumetrie.GetAllManualInsertionsFromDate
    @date date
AS
BEGIN
    SELECT i.Id, i.EntryDate, c.CustomerNumber, i.NbEnvelopes As envelope, i.NbBoxes As box,
            c.Name, YEAR(@date) As dateYear, MONTH(@date) As dateMonth, s.Raccourci as area
    FROM volumetrie.InsertionManuelle As i
        INNER JOIN dbo.Customers As c ON i.ClientId = c.CustId
        INNER JOIN dbo.Sites s ON i.SiteCode = s.CodeSite
    WHERE i.EntryDate >= @date
END
  • 正如@SeanLange 所说

正确的做法是:

-- =============================================
-- Create basic stored procedure template
-- =============================================

-- Drop stored procedure if it already exists
IF EXISTS (
  SELECT * 
    FROM INFORMATION_SCHEMA.ROUTINES 
   WHERE SPECIFIC_SCHEMA = N'volumetrie'
     AND SPECIFIC_NAME = N'GetAllManualInsertionsFromDate' 
)
   DROP PROCEDURE volumetrie.GetAllManualInsertionsFromDate
GO

CREATE PROCEDURE volumetrie.GetAllManualInsertionsFromDate
    @date date
AS
    SELECT i.Id, i.EntryDate, c.CustomerNumber, i.NbEnvelopes As envelope, i.NbBoxes As box,
            c.Name, YEAR(@date) As dateYear, MONTH(@date) As dateMonth, s.Raccourci as area
    FROM volumetrie.InsertionManuelle As i
        INNER JOIN dbo.Customers As c ON i.ClientId = c.CustId
        INNER JOIN dbo.Sites s ON i.SiteCode = s.CodeSite
    WHERE i.EntryDate >= @date
GO