关键字“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 >= ''08/04/1883'''
。注意:您仍然需要使用EXEC (@PDate)
单独执行查询。如果@PDate 不是 SQL 查询字符串,则可以忽略此答案。
【参考方案1】:
你的存储过程有两个问题:
-
不正确地使用
SET
运算符。这是一个错误
正如 Sean Lange 所说,存在从 datetime
到 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
第二个问题是从datetime
到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
【讨论】:
但 @PDate 是 varchar(max) 不是日期时间数据类型。从 datetime 到 varchar(max) 的隐式转换极不可能是 OP 真正想要的。 @SeanLange 感谢您的正确评论。我已经使用您的 cmets 编辑了我的答案。谢谢。以上是关于关键字“And”存储过程附近的语法不正确的主要内容,如果未能解决你的问题,请参考以下文章
EF Core 存储过程错误:'@p1' 附近的语法不正确 [关闭]
存储过程出现错误.关键字'ORDER'附近有语法错误.')'附近有语法错误.
添加新的 Join 语句后 MS-SQL 存储过程引发错误。消息 102,级别 15,状态 1,第 279 行“WHERE”附近的语法不正确