sql - 关键字 CASE(SQL 函数)附近的语法不正确
问题描述
我正在将大型 Access 应用程序移植到 SQL 服务器,为此我一直致力于将所有 VBA 函数重写为 SQL 函数。我无法执行以下创建函数语句。似乎我使用 CASE 不正确?感谢任何帮助,这是我第一次尝试 SQL 函数。
CREATE FUNCTION dbo.[NAL_PolicyCode]
(
@gm1 float,
@gm2 float = 1,
@gm3 float = 1,
@typ varchar(10) = ''
)
RETURNS VarChar(10)
AS BEGIN
DECLARE @gm float;
SET @gm = @gm1;
SET @gm = CASE
WHEN @gm2 < @gm THEN @gm2 END
SET @gm = CASE
WHEN @gm3 < @gm THEN @gm3 END
SET @gm = Round(@gm, 3);
IF(@typ = 'MS')
BEGIN
(CASE WHEN @gm < 0.03 THEN
PolicyCode = '1B'
WHEN @gm < 0.05 THEN
PolicyCode = '1C'
WHEN @gm < 0.08 THEN
PolicyCode = '1D'
WHEN @gm < 0.12 THEN
PolicyCode = '1E'
WHEN @gm < 0.16 THEN
PolicyCode = '1F'
WHEN @gm < 0.24 THEN
PolicyCode = '1G'
WHEN @gm < 0.29 THEN
PolicyCode = '1H'
WHEN @gm < 0.47 THEN
PolicyCode = '1J'
ELSE
PolicyCode = '1K'
END)
END
ELSE IF(@typ = 'PL')
BEGIN
(CASE WHEN @gm < 0.35 THEN
PolicyCode = "8"
WHEN @gm < 0.45 THEN
PolicyCode = "P"
WHEN @gm < 0.58 THEN
PolicyCode = "V"
WHEN @gm < 0.7 THEN
PolicyCode = "4"
ELSE
PolicyCode = "R"
END)
END
ELSE
BEGIN
(CASE WHEN @gm < 0.16 THEN
PolicyCode = "Y"
WHEN @gm < 0.24 THEN
PolicyCode = "Z"
WHEN @gm < 0.29 THEN
PolicyCode = "X"
WHEN @gm < 0.36 THEN
PolicyCode = "9"
WHEN @gm < 0.41 THEN
PolicyCode = "J"
WHEN @gm < 0.47 THEN
PolicyCode = "N"
WHEN @gm < 0.55 THEN
PolicyCode = "D"
WHEN @gm < 0.63 THEN
PolicyCode = "S"
WHEN @gm < 0.75 THEN
PolicyCode = "T"
ELSE
PolicyCode = "U"
END)
END
END;
解决方案
你有:
IF(@typ = 'MS')
BEGIN
(CASE WHEN @gm < 0.03 THEN
PolicyCode = '1B'
. . .
您使用的构造称为“控制流”,因为它处于对 T-SQL 块进行编程的级别。T-SQL中没有case
控制流子句。大概,你打算这样:
IF(@typ = 'MS')
BEGIN
SET @PolicyCode = (CASE WHEN @gm < 0.03 THEN PolicyCode = '1B'
. . .
推荐阅读
- apache-kafka - 当生产者向不存在的主题发出事件并禁用主题的自动创建时会发生什么?
- jenkins - 如何将多分支项目的队列作业放入队列中?
- c# - 如何将 SQL 的非 Table 字段设置为 Crystal Report 设计和参数
- html - 如何在图像悬停时制作可点击图标
- javascript - 使用javascript将反斜杠url替换为正斜杠url
- c++ - 如何使用 C++ 打印 Pentomino 矩形
- php - 使用 AJAX 向 php 文件发送查询时变量保持为空
- scala - Scala 模式匹配中无法访问的代码
- c# - 从图像中删除所有水平和垂直线
- c++ - boost中累加器的实现是什么?