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

时间:2019-01-03 17:31:59

标签: sql sql-server

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

我得到这些错误:

  

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

     

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

1 个答案:

答案 0 :(得分:1)

您的存储过程中有两个问题:

  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