【问题标题】:Must declare the scalar variable which is a procedure parameter必须声明作为过程参数的标量变量
【发布时间】:2015-03-02 20:17:53
【问题描述】:

如果它不存在,我正在尝试创建一个过程。此过程采用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”附近的语法不正确。期待外部。

你知道我做错了吗?

【问题讨论】:

  • 创建过程必须是批处理中的唯一语句。这不是你在这里所拥有的。如果该过程已经存在,您需要使用您的条件来删除该过程,或者使用动态 sql 生成您的过程。
  • 谢谢,我会记住动态 SQL 作为替代方案。

标签: sql sql-server tsql stored-procedures


【解决方案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 所说

【讨论】:

    【解决方案2】:

    这是正确的做法:

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

    【讨论】:

    • 为什么这是检查存储过程是否存在的正确方法?和我做的有什么区别?
    • @BishopBarber 这是微软的做法,尝试使用模板浏览器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2016-04-17
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多