"将nvarchar值转换为数据类型int"转换失败在CASE声明中

时间:2014-09-12 12:57:40

标签: sql-server

以下查询返回上述错误。 WNT.USER.PriviligeLevel_SV列包含值1,2,3或不同的错误。如果值为1,我需要让查询返回'Administrator',如果值为2则返回'Guest',如果值为3,则返回'User'。否则此列应包含逐字错误消息。我曾尝试使用ELSE CAST([Wnt.User.PrivilegeLevel_SV] AS nvarchar)WHEN [Wnt.User.PrivilegeLevel_SV] NOT LIKE '%[^0-9]%',但两者都没有效果。请指教。

SELECT [Wnt.User.Host] AS 'Machine Name',
         "Account Privilege Level" =
         CASE 
              When [Wnt.User.PrivilegeLevel_SV] = 1 Then 'Administrator'
              When [Wnt.User.PrivilegeLevel_SV] = 2 Then 'User'
              When [Wnt.User.PrivilegeLevel_SV] = 3  Then 'Guest'
              Else [Wnt.User.PrivilegeLevel_SV]
              End 
  FROM [Prod].[AdHoc].[TestBuffer]

SQL版本是2008,WNT.USER.PriviligeLevel_SV列定义为nvarchar(max)

2 个答案:

答案 0 :(得分:2)

SQL Server中同一CASE的不同分支返回的数据类型不同。 (即使分支不会被执行也是如此)

由于SQL Server的data type precedence规则,VARCHAR值被强制导入INT失败。

您应该将值从Else - 分支转换为NVARCHAR(或VARCHAR),以使CASE的所有分支返回相同的数据类型。

即。例如Else CAST([Wnt.User.PrivilegeLevel_SV] AS NVARCHAR(MAX))

答案 1 :(得分:0)

实际上这很简单:

SELECT [Wnt.User.Host] AS 'Machine Name',
     "Account Privilege Level" =
     CASE 
          When [Wnt.User.PrivilegeLevel_SV] = '1' Then 'Administrator'
          When [Wnt.User.PrivilegeLevel_SV] = '2' Then 'User'
          When [Wnt.User.PrivilegeLevel_SV] = '3'  Then 'Guest'
          Else [Wnt.User.PrivilegeLevel_SV]
          End 
FROM [Prod].[AdHoc].[TestBuffer]

如果列类型为varchar,则需要确保将数字用单引号括起来。