sql - 关键字“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 行
关键字“和”附近的语法不正确。
解决方案
你的存储过程有两个问题:
- 错误地使用
SET
运算符。这是一个错误 - 正如 Sean Lange 评论的那样,存在从
datetime
to的隐式转换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
to的隐式转换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
推荐阅读
- lua - Roblox Studio (LUA) - 将表保存到 DataStore(不工作)
- javascript - Firebase 服务不包含 React 中的其他页面
- delphi - TJvMemoryData.InternalSetFieldData 中的零星访问冲突
- amazon-web-services - 在这个用例中,Lambda 是否需要 SQS?
- javascript - 使用 fetch 时 POST https://accounts.spotify.com/api/token 415 错误
- sql - 如何对 SQL 中的 2 个查询求和
- wordpress - WordPress登录后如何重定向到仪表板?
- codeblocks - 如何在 code::blocks 中使用 LAPACK 和 BLASE 库?
- arrays - 如何在 Firebase 实时数据库的“数组”中按索引插入/删除项目?
- c++ - 如何处理模板类中的复合类型