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'附近的语法不正确。
答案 0 :(得分:1)
您的存储过程中有两个问题:
SET
运算符。这是一个错误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