【发布时间】: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 查询字符串,则可以忽略此答案。
标签: sql sql-server