关键字'And'存储过程附近的语法不正确


USE [productDb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_ProcName]
    @Name VARCHAR(100),
    @PDate NVARCHAR(MAX) NULL,
    @City VARCHAR(100),
    @Birthday VARCHAR(100)
AS 
BEGIN
    IF (@Name = '')
       IF @Birthday = -1
       BEGIN
           SET @PDate = And ProductDate >= '08/04/1883'
       END
       ELSE 
       BEGIN
           SET @PDate = And ProductDate <= '08/04/1883'
       END
   ELSE
   BEGIN
       SELECT * FROM Product
   END
END

我收到这些错误:

Msg 156,级别 15,状态 1,过程 usp_ProcName,第 18
行 关键字"And"附近的语法不正确。

Msg 156,级别 15,状态 1,过程 usp_ProcName,第 22
行 关键字"And"附近的语法不正确。

存储过程中有两个问题:

  1. 不正确地使用SET运算符。这是一个错误
  2. 正如肖恩·兰格(Sean Lange)所评论的那样,从datetimevarchar(max)的隐式转换。此方法允许您在需要时更改格式,或执行日期数学运算。

让我们更精确地查看第一个错误:SET运算符用于分配数据。您在SET中编写了不正确的语句:

set @PDate = And ProductDate >= '08/04/1883'
    End
    Else
    Begin
        set @PDate = And ProductDate <= '08/04/1883'

您应该在 SET 运算符中设置数据。例如:

Begin
    set @PDate = GETDATE()
End
Else
    Begin
        set @PDate = GETDATE()
    end

第二个问题是从datetimevarchar(max)的隐式转换。可以使用正确的数据类型来修复它。因此,这种方法允许您在需要时更改格式,或者进行日期数学运算:

ALTER PROCEDURE [dbo].[usp_ProcName]
 @Name          VARCHAR(100) 
, @PDate         DateTime = NULL
, @City          VARCHAR(100) 
, @Birthday      VARCHAR(100) 
AS 
IF (@Name='')
If @Birthday=-1
Begin
    set @PDate = GETDATE()
End
Else
    Begin
        set @PDate = GETDATE()
    end

相关内容