2014-09-12 3 views
0

의 "nvarchar 값을 데이터 형식 int로 변환 할 때 변환이 실패했습니다"다음 쿼리는 앞에서 설명한 오류를 반환합니다. 열 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]%'을 사용해 보았지만 어느 것도 작동하지 않았습니다. 제발 조언.CASE 문

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 서버의

인해 data type precedence에 대한 규칙은 VARCHAR 값은 실패 INT 강제로 취득 (이 지점이 실행되지 않더라도도 마찬가지입니다).

당신은 CASE 반환 같은 데이터 타입의 모든 지점을 가지고 NVARCHAR (또는 VARCHAR)에 -Branch Else에서 값을 캐스팅해야

.

e.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 문에서 '반환 된 값'입니다. – DrCopyPaste

+0

case 문은 전체 테이블에서 일치하는 항목을 검색하므로 int와 varchar의 비교가 발생하면 오류가 발생합니다. 이들이 모두 문자열 유형이기 때문에에 의해 반환 된 값에는 아무런 문제가 없습니다. –

+0

사실 SQL Server는 구문 분석 가능한 한 varchar와 int를 비교하는 것만으로는 충분하지 않습니다. 예를 들어 [this] (http://sqlfiddle.com/#!6/d41d8/21535) 및 [that] (http://sqlfiddle.com/#!6/d41d8)을 고려하십시오. (성공하는 동안 다른 반환 유형으로 인해 실패합니다.) – DrCopyPaste