目前,我正在重写旧的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);
答案 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/when
和dynamic
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
)