CASE表达式之间存在语法错误

时间:2018-11-29 12:38:14

标签: sql sql-server tsql

目前,我正在重写旧的T-SQL过程,今天发现了一些困难。

在变量中设置了一个长查询。

{d:4,e:5}

现在,我想将其修改为普通查询,但是在CASE表达式中使用之间语法存在问题。看起来应该像这样。

    set @Sql='
    ....
    ....
    where ('+ case when @p_TypeOfDataZak = 1 then 'cdn.MS_VatToDate(TrN_VatYear,
 TrN_VatMouth, TrN_VatDay) between cdn.MS_CDNDateToDate('+@DateFromv+') and cdn.MS_CDNDateToDate('+@DateTov+')'
                  else 'TrN_DataMag between '+@DateFromv+' and '+@DateTov
                   end +')
    ....
    ....
    exec (@Sql);

2 个答案:

答案 0 :(得分:1)

您应该使用变量和sp_execute_sql -尤其是在更新代码时!

所以:

set @Sql='
....
....
where (' +
      case when @p_TypeOfDataZak = 1 then 
           then 'cdn.MS_VatToDate(TrN_VatYear, TrN_VatMouth, TrN_VatDay) between cdn.MS_CDNDateToDate(@DateFromv) and cdn.MS_CDNDateToDate(@DateTov)'
           else 'TrN_DataMag between @DateFromv and @DateTov
      end + ')
  ....

exec sp_executesql @Sql,
                   N'@DateTov date, @DateFromv date',
                   @DateTov=@dateTov, @DateFromv=@DateFromv

答案 1 :(得分:0)

初始化后,@Sql变量是包含以下内容的字符串:

如果@p_TypeOfDataZak = 1

where (
    cdn.MS_VatToDate(TrN_VatYear, TrN_VatMouth, TrN_VatDay)
    between cdn.MS_CDNDateToDate('+@DateFromv+')
    and cdn.MS_CDNDateToDate('+@DateTov+')
)

如果@p_TypeOfDataZak <> 1

where (
    TrN_DataMag between '+@DateFromv+' and '+@DateTov+'
)

如果要删除case/whendynamic sql结构,请尝试以下操作:

where
(
    cdn.MS_VatToDate(TrN_VatYear, TrN_VatMouth, TrN_VatDay)
    between cdn.MS_CDNDateToDate('+@DateFromv+')
    and cdn.MS_CDNDateToDate('+@DateTov+')
    and @p_TypeOfDataZak = 1
)
or
(
    TrN_DataMag between '+@DateFromv+' and '+@DateTov+'
    and @p_TypeOfDataZak <> 1
)