首页 > 解决方案 > 关键字“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

我收到这些错误:

消息 156,级别 15,状态 1,过程 usp_ProcName,第 18 行
关键字“与”附近的语法不正确。

消息 156,级别 15,状态 1,过程 usp_ProcName,第 22 行
关键字“和”附近的语法不正确。

标签: sqlsql-server

解决方案


你的存储过程有两个问题:

  1. 错误地使用SET运算符。这是一个错误
  2. 正如 Sean Lange 评论的那样,存在从datetimeto的隐式转换varchar(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

第二个问题是从datetimeto的隐式转换varchar(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

推荐阅读