2013-05-14 5 views
4

여기에 무슨 문제가있을 수 있습니까?nvarchar 값을 데이터 유형 int로 변환 할 때 변환하지 못했습니다.

모든 변수는 nvarchar입니다. @FunctionValue에 INT가 문자열 형식으로 포함되어 있으면 오류가 발생합니다.

IF @TargetType = 'INT' 
BEGIN 
    SELECT @SQLSTR = 'UPDATE ' + @TargetTable + 
         ' SET ' + @TargetColumn + ' = ' + COALESCE(CAST(@FunctionValue AS INT), CAST(@Value AS INT)) + 
         ' ' 
END 
+0

당신은 @SQLSTR varchar + INT ... COALESCE (CAST (@FunctionValue AS INT), CAST (@Value AS INT))를 할당하려합니다. INT가되고 Varchar와 직접 연결할 수 없습니다 – bummi

+0

@bummi 무엇을합니까? 그때해야합니까? – hermann

+0

COALESCE (@ FunctionValue, @ Value) 또는 VARCHAR (20)과 같이 적어도 Cast (COALESCE (CAST (@FunctionValue AS INT), CAST (@Value AS INT)) – bummi

답변

4

을하는 데 도움이 문제는 + 연산자의 모호함입니다. 인수가 숫자 인 경우 문자열 연결이 아닌 숫자 추가를 수행한다고 가정합니다.

원본 데이터가 문자, 당신은 완전히 캐스트 제거하여 문제를 해결할 수있는 경우 : 원본 데이터가 숫자 인 경우

IF @TargetType = 'INT' 
BEGIN 
    SELECT @SQLSTR = 'UPDATE ' + @TargetTable + 
         ' SET ' + @TargetColumn + ' = ' + COALESCE(@FunctionValue, @Value) + 
         ' ' 
END; 

을, 당신은 명시 적으로 문자로 변환해야합니다

IF @TargetType = 'INT' 
BEGIN 
    SELECT @SQLSTR = 'UPDATE ' + @TargetTable + 
         ' SET ' + @TargetColumn + ' = ' + cast(cast(COALESCE(@FunctionValue, @Value) as int) as varchar(255)) + 
         ' ' 
END; 

또한 coalesce() 외부의 "캐스트를 int로"이동했습니다.

2

유형을 명시 적으로 변환하지 않고 'varchar'와 'int'를 변환하고 있습니다. 이 경우 우선 순위가 가장 높은 데이터 유형이 우선합니다. 이 경우 Int는 varchar보다 우선 순위가 높으므로 전체 문이 Int가됩니다. 그리고 int를 varchar로 명시 적으로 변환하는 것은 허용되지 않습니다.

지능 값 주위에 'VARCHAR로 CAST ...'을 포장하십시오 : 데이터 형 된 우위의 목록

CAST(COALESCE(CAST(@FunctionValue AS INT), CAST(@Value AS INT)) AS NVARCHAR(255)) 

참조 http://technet.microsoft.com/en-us/library/ms190309(v=sql.105).aspx

희망이

+0

그러나이 말은 이해할 만하지만 여전히 오류가 발생합니다. – hermann

+0

아, 죄송합니다. varchar가 아닌 nvarchar를 사용하고 있습니다. NVARCHAR (xxx)로 캐스팅해야 할 수도 있습니다. 여기서 xxx는 필요한 데이터의 크기입니다. 당신이 얻는 것과 같은 오류입니까? – Rodders

관련 문제