【问题标题】:SQL Server : Incorrect syntax near '<' and 'day' Expecting '(' or SELECTSQL Server:'<' 和 'day' 附近的语法不正确,期望 '(' 或 SELECT
【发布时间】:2021-07-01 04:30:45
【问题描述】:

以下是将查询返回到我的暗网项目的过程。我想在哪里获取过去 6 个月、过去 1 周和过去 1 个月的记录。

我会根据查询结果返回'KAYITTARIHI'

ALTER PROCEDURE [dbo].[CVSearch]
    @Adi nvarchar(50) = NULL,
    @Soyadi nvarchar(50) = NULL,
    @BasvuruTarihi nvarchar(50) = NULL
AS
    IF (@Adi = '')
        SET @Adi = NULL

    IF (@Soyadi = '')
        SET @Soyadi = NULL

    IF (@BasvuruTarihi = '')
        SET @BasvuruTarihi = NULL
            
    SELECT ID_CV 
    FROM CV 
    WHERE KULLANICILAR_CV_SILMEDURUMU  = 0 
      AND ADI LIKE '%' + ISNULL(@Adi, ADI) + '%' 
      AND SOYADI LIKE '%' + ISNULL(@Soyadi, SOYADI) + '%' 
      AND CASE 
             WHEN @BasvuruTarihi = 'Hepsi' 
                THEN KAYITTARIHI  
             WHEN @BasvuruTarihi = 'Last 1 week' 
                THEN DATEDIFF(day, KAYITTARIHI, GETDATE()) < 8 
             WHEN @BasvuruTarihi = 'Last 1 month' 
                THEN DATEDIFF(day, KAYITTARIHI, GETDATE()) < 31  
             WHEN @BasvuruTarihi = 'Last 6 month' 
                THEN DATEDIFF(day, KAYITTARIHI, GETDATE()) < 180 
             ELSE @BasvuruTarihi 
          END = KAYITTARIHI

但我收到这些错误:

当 @BasvuruTarihi='Last 1 week' 然后 DATEDIFF(day,KAYITTARIHI,GETDATE()) 时,'> 附近的语法不正确

当 @BasvuruTarihi='Last 1 month' THEN DATEDIFF(day,KAYITTARIHI,GETDATE()) 时,'day' 附近的语法不正确预期 '(' 或 SELECT =>>

'=' 附近有错误的语法期待对话 =>> end = KAYITTARIHI

【问题讨论】:

  • 对换行符和空格的良好使用将使 SQL 更易于阅读和调试。
  • 另外,你听到的是一个包罗万象的查询,但像 like '%' + ISNULL(@Adi, ADI) + '%' 这样的语法将远非高效。
  • 您已将日期时间比较作为 THEN 的一部分 case 表达式 - 这是非法的。 case 表达式只能返回一个值。您还可能(取决于这些比较应该做什么,从不同的分支获得完全不同的返回值 - 这也是非法的。
  • then DATEDIFF(day,KAYITTARIHI,GETDATE())&lt;8 是什么意思?如果你想要一个真/假结果,你需要一个额外的 CASE 或 IIF 语句。
  • A CASE expression 返回一个 scalar 值。看看你的;您有 2 个子句返回一个标量值,然后其他 3 个子句返回一个布尔结果,然后将这些值 compareKAYITTARIHI 进行比较,这没有任何意义。同样,某些格式会很快向您展示该问题。

标签: sql sql-server tsql case


【解决方案1】:

这是一个完全盲目的猜测,但我猜这是你真正想要的东西。由于领先的外卡,这仍然不会表现出色,但是,我至少已经尽可能多地做到了 SARGable。我还添加了OPTION (RECOMPILE),让数据引擎最好有机会使用与查询相关的查询计划。

SELECT ID_CV
FROM dbo.CV
WHERE KULLANICILAR_CV_SILMEDURUMU = 0
  AND (ADI LIKE N'%' + @Adi + N'%' OR @Adi IS NULL)
  AND (SOYADI LIKE N'%' + @Soyadi + N'%' OR @Soyadi IS NULL)
  AND (@BasvuruTarihi = N'Hepsi'
   OR  (@BasvuruTarihi = N'Last 1 week' AND KAYITTARIHI >= CONVERT(date,DATEADD(DAY,-7,GETDATE())))
   OR  (@BasvuruTarihi = N'Last 1 week' AND KAYITTARIHI >= CONVERT(date,DATEADD(DAY,-30,GETDATE()))) --This isn't a month
   OR  (@BasvuruTarihi = N'Last 1 week' AND KAYITTARIHI >= CONVERT(date,DATEADD(DAY,-180,GETDATE())))) --This isn't 6 months
OPTION (RECOMPILE);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2017-07-15
    相关资源
    最近更新 更多