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

Posted

技术标签:

【中文标题】关键字“And”存储过程附近的语法不正确【英文标题】:Incorrect syntax near the keyword 'And' stored procedure 【发布时间】:2019-01-03 17:31:59 【问题描述】:
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”附近的语法不正确。

【问题讨论】:

提示:@PDate 是一个字符串,所以你需要字符串操作符。 @PetroK 太奇怪了,完全无效。但是这里的代码总体来说有很大的问题。 @PDate 将包含一个字符串。不是引擎将这样处理的完整 SQL 查询的任意片段。没有办法存储 SQL 语句的片段,也没有办法将这些片段“组合”成整个语句。 (除了在整个过程中使用字符串并强制一个单独的解析/编译/执行阶段,我尽量避免)。 你应该问一个关于如何实现你的最终目标的问题。你目前的方法偏离了轨道 这里唯一有意义的情况是 @PDate 是一个完整的 SQL 查询,并且您在执行它时试图在查询的末尾添加一个条件值。这不是有效的 T-SQL。相反,您可以使用SET @PDate = @PDate + ' AND ProductDate &gt;= ''08/04/1883'''。注意:您仍然需要使用EXEC (@PDate) 单独执行查询。如果@PDate 不是 SQL 查询字符串,则可以忽略此答案。 【参考方案1】:

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

    不正确地使用SET 运算符。这是一个错误 正如 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

【讨论】:

但 @PDate 是 varchar(max) 不是日期时间数据类型。从 datetime 到 varchar(max) 的隐式转换极不可能是 OP 真正想要的。 @SeanLange 感谢您的正确评论。我已经使用您的 cmets 编辑了我的答案。谢谢。

以上是关于关键字“And”存储过程附近的语法不正确的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 存储过程错误:'@p1' 附近的语法不正确 [关闭]

存储过程出现错误.关键字'ORDER'附近有语法错误.')'附近有语法错误.

添加新的 Join 语句后 MS-SQL 存储过程引发错误。消息 102,级别 15,状态 1,第 279 行“WHERE”附近的语法不正确

存储过程的统计结果

关键字“with”附近的语法不正确...上一条语句必须以分号结束

错误:消息102,级别15,状态1,过程InsertCustomers,第30行'THROW'附近的语法不正确