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
我收到这些错误:
Msg 156,级别 15,状态 1,过程 usp_ProcName,第 18
行 关键字"And"附近的语法不正确。Msg 156,级别 15,状态 1,过程 usp_ProcName,第 22
行 关键字"And"附近的语法不正确。
存储过程中有两个问题:
- 不正确地使用
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