2012-11-04 7 views

답변

4

여기이 질문에 대한 내 자신의 대답이다 (또한 마지막 업데이트 참조) :

없음을, 문자열 식에 정의 된 같은 단항 연산자는 없다. 이것은 버그 일 수 있습니다.

설명 :

주어진 문장은 유효하며 아래의 결과를 생성합니다

(No column name) 
---------------- 
ABCDEF 
(1 row(s) affected) 

+ 기호 사용하지 않고 SELECT 문을 수행하는 것과 같습니다

SELECT 'ABCDEF' 

을 실제로 오류가 발생하지 않고 컴파일되면서이라는 인상을줍니다.은 주어진 문자열에서 Unary 연산으로 작동합니다. 그러나 공식 T-SQL 설명서에는 이러한 연산자에 대한 언급이 없습니다. 사실, "String Operators"이라는 제목의 섹션에서 + (String Concatenation)+= (String Concatenation) 인 두 개의 문자열 연산에 +이 나타납니다. 둘 다 Unary 작업입니다. 또한 "Unary Operators"섹션에는 3 가지 연산자가 도입되었으며 그 중 하나만 + (Positive) 연산자입니다. 그러나 관련성이있는 것으로 보이는이 연산자에 대해서는 + (Positive)에 대한 설명에 명시 적으로이 연산자가 숫자 값에만 적용 가능하다고 명시되어 있으므로이 연산자도 숫자가 아닌 문자열 값과 아무 관련이 없습니다. "Returns the value of a numeric expression (a unary operator)". 아마도

는,이 연산자가 성공적으로 성공적으로 여기에 사용 된 것과 같은 숫자로 평가하는 문자열 값을 받아 들일있다 :

SELECT +'12345'+1 

위의 문을 실행, 그것은 숫자를 생성 하지만, 분명히 다른 양이 될 수 여기 1 인 다수 그것에 추가 numberic 값으로 평가 모두 주어진 문자열의 합 출력에 그러나

(No column name) 
---------------- 
12346 
(1 row(s) affected) 

는 I이 의심 설명은 다음과 같은 질문에 제기 된대로 정확합니다.

첫 번째로이 설명이 사실이라고 인정하면 +'12345'과 같은 표현이 숫자로 평가된다는 결론을 내릴 수 있습니다. 그렇다면이 숫자가 DATALENGTH, LEN 등과 같이 문자열 관련 함수에 나타날 수있는 이유는 무엇입니까?

SELECT DATALENGTH(+'12345') 

은 아주 유효하며 아래의 결과 : 당신은 이와 같은 진술을 볼 수 +'12345'을 의미

(No column name) 
---------------- 
5 
(1 row(s) affected) 

이 문자열이 아닌 숫자로 평가되고있다. 어떻게 설명 할 수 있습니까?

둘째 반면, 이와 같은 - 연산자와 마찬가지로 문 :

`SELECT -'ABCDE'` 

또는이 :

`SELECT -'12345'` 

은 아래 오류 발생 :

Invalid operator for data type. Operator equals minus, type equals varchar. 

이유는 shouldn 유사한 경우에 오류가 발생합니다. + 연산자 숫자가 아닌 문자열 값에 잘못 사용 되었습니까?

그래서이 두 질문은 숫자 값에 대한 설명서에 소개 된 + (unary) 연산자와 동일한 설명을 수락하지 못하게합니다. 다른 곳에서는 언급하지 않으므로 의도적으로 언어에 추가 될 수 있습니다. 버그 일 수 있습니다.

문제는 우리가 오류가 이와 같은 진술에 대해 생성되지 볼 때 더 심각한 것으로 보이는 하나 하나 :

SELECT ++++++++'ABCDE' 

이러한 종류의 동의 거기에 다른 프로그래밍 언어가 있는지 모르겠어요 의 진술. 그러나 존재한다면 어떤 목적으로 문자열에 적용된 + (unary) 연산자를 사용하는 것이 좋을 것입니다. 나는 어떤 사용법을 상상할 수 없다!

UPDATE 여기

는이 이전 버전의 버그되었습니다하지만 때문에 이전 버전과의 호환성의 고정되지 않습니다 말합니다 따라 문자열에 단항 연산자가있다

After some investigation, this behavior is by design since + is an unary operator. So the parser accepts "+ , and the '+' is simply ignored in this case. Changing this behavior has lot of backward compatibility implications so we don't intend to change it & the fix will introduce unnecessary changes for application code.

+1

https://connect.microsoft.com/SQLServer/feedback/details/718176/concatenation-operator-not-working-properly –

+0

당신은 이것을 의미합니까? "조사 후에는 +가 단항 연산자이므로이 동작이 의도적으로 설정되어 있으므로 파서는"+ "을 허용하며이 경우 '+'는 무시됩니다. 이 동작을 변경하면 이전 버전과의 호환성에 많은 영향을 미치므로이를 변경하지 않고 응용 프로그램 코드에 불필요한 변경 사항을 적용하게됩니다. " – RGO

+0

예. 다른 응답을 인용 한 후에 게시되었으므로 적어도 MS가이 점에 관해서는 버그가 아니라 "의도적으로 설계된 것"입니다. "수정하지 않겠습니다"보다는 "설계 상으로는"닫힙니다. –

관련 문제