必须声明标量变量,这是一个过程参数

时间:2015-03-02 20:17:54

标签: sql sql-server tsql stored-procedures

我正在尝试创建一个程序,如果它尚不存在的话。此过程采用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参数的所有三个地方都收到错误:

  

必须声明标量变量@date

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

  

'BEGIN'附近的语法不正确。期待外在。

你看到我做错了吗?

2 个答案:

答案 0 :(得分:1)

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所说

答案 1 :(得分:1)

这是正确的方法:

-- =============================================
-- 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