2014-09-12 129 views
0

以下查询返回上述错误。列WNT.USER.PriviligeLevel_SV包含值1,2,3或不同的错误。如果值为1,则需要返回“管理员”,如果值为2,则返回“客户”,如果值为3,则返回“用户”。否则,此列应包含逐字错误消息。我试图使用ELSE CAST([Wnt.User.PrivilegeLevel_SV] AS nvarchar)WHEN [Wnt.User.PrivilegeLevel_SV] NOT LIKE '%[^0-9]%',但都没有工作。请指教。CASE语句中的“将nvarchar值转换为数据类型int时转换失败”

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的(最大)

回答

2

你不能在SQL Server的同一CASE的不同分支返回不同的数据类型。 (这也是真实的,即使一个分支不再执行)的SQL Server

由于data type precedence规则VARCHAR值获得被迫INT其失败。

您应该从Else分枝到NVARCHAR(或VARCHAR)投你的价值有CASE返回相同的数据类型的所有分支机构。

I.e.例如,Else CAST([Wnt.User.PrivilegeLevel_SV] AS NVARCHAR(MAX))

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。

+0

不,问题不是由''求值'的值,而是''从case case语句返回的值。 – DrCopyPaste 2014-09-12 13:06:41

+0

case语句将搜索整个表中的匹配项,因此当发生int和varchar比较时会引发错误。由返回的值没有问题,因为这些都是字符串类型。 – 2014-09-12 13:09:49

+0

没有其他的SQL Server比较好,只要它们是可解析的就可以比较varchar和ints。考虑[this](http://sqlfiddle.com/#!6/d41d8/21535)和[that](http://sqlfiddle.com/#!6/d41d8)。 (由于返回类型不同而失败,但成功) – DrCopyPaste 2014-09-12 13:13:12