Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 转换case语句中的varchar值时,转换失败_Sql Server_Case - Fatal编程技术网

Sql server 转换case语句中的varchar值时,转换失败

Sql server 转换case语句中的varchar值时,转换失败,sql-server,case,Sql Server,Case,我无法控制它。我们有以下简单的查询 DECLARE @bFlag bit SET @bFlag = 0 SELECT something = CASE WHEN @bFlag = 1 THEN CASE WHEN RS.intInterval = 1 THEN '"Days"' WHEN RS.intInterval = 2 T

我无法控制它。我们有以下简单的查询

DECLARE @bFlag bit
SET @bFlag = 0
SELECT  something = CASE
                WHEN @bFlag = 1 THEN
                    CASE
                        WHEN RS.intInterval = 1 THEN '"Days"'
                        WHEN RS.intInterval = 2 THEN '"Weeks"'
                        WHEN RS.intInterval = 3 THEN '"Months"'
                        WHEN RS.intInterval = 4 THEN '"Years"'
                    END
                Else 
                    RS.intInterval
                End
from    MyTable  AS RS WITH (NOLOCK)
因此,如果
flag
未设置为
true
,我想获得
intInterval
(即
int
)。否则,如果
标志
设置为
,则我希望根据
intInterval
的值获得
,等等。如果我使用
@bFalg=1
运行此操作,则会出现以下错误:

将varchar值“Weeks”转换为数据时,转换失败 int型

这没有任何意义,因为我没有转换任何东西


我知道我可以通过将
cast(intInterval作为varchar)
放入
else
部分来修复它。但是,我想知道为什么会出现此错误,为什么
case
试图将“Weeks”转换为
int

使用
case
语句时,所有结果表达式必须具有相同的数据类型。否则,结果将转换为具有更高优先级的数据类型。根据:

从中的类型集中返回优先级最高的类型 结果\u表达式和可选的else\u结果\u表达式

由于
INT
的值高于
VARCHAR
将“周”
转换为
INT
,从而产生错误:

将varchar值“Weeks”转换为数据时,转换失败 int型

另一个将产生相同错误的示例:

SELECT CASE WHEN 1 = 1 THEN 'True' ELSE 0 END

解决方案是将
RS.intInterval
转换为
VARCHAR

CONVERT(VARCHAR(10), RS.intInterval)
您的最终查询应该是:

DECLARE @bFlag bit
SET @bFlag = 0
SELECT  something = CASE
                WHEN @bFlag = 1 THEN
                    CASE
                        WHEN RS.intInterval = 1 THEN '"Days"'
                        WHEN RS.intInterval = 2 THEN '"Weeks"'
                        WHEN RS.intInterval = 3 THEN '"Months"'
                        WHEN RS.intInterval = 4 THEN '"Years"'
                    END
                Else 
                    CONVERT(VARCHAR(10), RS.intInterval)
                End
from    MyTable  AS RS WITH (NOLOCK)

谢谢,我一直在寻找这个位“返回result_表达式和可选的else_result_表达式中类型集的最高优先级类型。”这对于追踪来说尤其烦人,因为错误标记了case语句中没有发生转换的分支-问题不明显是
case
的另一个分支。