복붙노트

[SQL] 부동 소수점으로 값을 캐스팅 할 수 없습니다

SQL

부동 소수점으로 값을 캐스팅 할 수 없습니다

우리는 COLUMNA에 (FLOAT까지) CAST 기능을 수행하는 SQL을 가지고있다. 는 SQL이 결국 간접적 COLUMNA 비 수치가 그 행을 필터링하는 필터를 갖는다. 그러나, 나는 paralell에서 SQL의 일부를 실행하기 때문에 믿고 무엇 때문에, 나는 CAST 심지어 필터링 된 행에 적용이는 SQL이 float로서 수없는 캐스트 가치 "에 실패 할 수 있다고 생각 ... "

나는 쿼리 힌트를 추가하여 하나의 PROC로 실행하면 것을 알고있다

OPTION (MAXDOP 1)

는 SQL 실행 것으로 예상한다. 그래서 그 값의 주조가 성공할 1 PROC 힘 필터에서 실행하는 것은 COLUMNA에 숫자가 아닌 값으로 행 걸러에 적용 할 수 있다고 생각한다. 또한 쿼리 힌트를 사용하여 해당 발견

OPTION (FORCE ORDER)

수정 문제는, 내가 너무 becausethis을 가정하고하는 것은 필터가 먼저 적용되고 내가 하나 하나 개의 실린더에서 실행하는 것이 훨씬 더 나은 쿼리 성능을 보장합니다.

나는 2 옵션을 사용하여 문제를 해결 torwards 기대어입니다. 내가 여기 또는 경우에 무슨 일이 일어나고 있는지에 대한 오해가 있다면 누군가 내가 그것을 감사하겠습니다, 이해하거나 추천을 내 일반에 상세히 설명하고자합니다.

나는에 실행하고

군더더기 :

그것은 좋을 것 같습니다 것은 T-SQL은 다음과 같은 기능이 문자열이 특정 데이터 형식으로 변환 할 수 있는지 확인했다입니다.

IsFloat ISNUMERIC IsInteger 기타

나는 정말 VARCHAR (255)로 정의됩니다 우리의 데이터베이스에서 찾을 것을 얼마나 많은 데이터의 모든 종류의 열에서 화가입니다. 나는 솔루션 것 같다 "그렇게하지!"

해결법

  1. ==============================

    1.당신의 후와 관련하여 생각했다.

    당신의 후와 관련하여 생각했다.

    SQL 서버 2012은 이러한 요구에 대한 TRY_CONVERT을 소개한다. 다음 쿼리는 오류가 아닌 NULL을 반환 그래서.

    SELECT TRY_CONVERT ( FLOAT, 'Fish')
    

    심지어 SELECT 평가되기 전에 WHERE 절 일이 일어날 것을 시리얼 계획을 보장 할 수 없습니다. SQL 서버 2005이 블로그 게시물에서 설명한대로 이후이 가능성이 이전 버전에 비해 발생하는 것입니다. 엔진은 SQL Server 2005의 특징 데이터베이스에 동작 변경은 구체적으로 다음과 같이를 호출합니다.

    이 문제에 대한 자세한 논의는 크레이그 프리드먼 변환 및 산술 오류에 의한 또 다른 좋은 블로그 게시물입니다.

    이전 2012 TRY_CONVERT에 버전에 당신은 CASE 문에 FLOAT로 CAST를 포장해야합니다. 예를 들면

      SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
      FROM Table
      WHERE ISNUMERIC(Col)=1
    

    이것은 여전히 ​​절대적으로 당신이 값이 실패 입력의 예를 떠 아니라 특히보다 숫자 데이터 유형 중 하나에 캐스팅 것이라고 ISNUMERIC 자체 만 검사 등의 오류를 받고 방지하기 위해 보장 할 수 없습니다 '.'

    CASE (일부 예외가 여기에 설명) 온라인 책에 주로 단락에 설명되어 있습니다

    또한 SQL 서버가 비논리적 오류 및 SQLKiwi하여 유사한 문제의 좋은 설명을 인상하지 말아야 연결 항목이에 대한 자세한 논의 / 불만을 찾을 수 있습니다

  2. ==============================

    2.난 당신이 올바른 생각합니다. 변환 () 함수는 술어 전에 적용되는 행에서 "간접적 필터링".

    난 당신이 올바른 생각합니다. 변환 () 함수는 술어 전에 적용되는 행에서 "간접적 필터링".

    예외를 방지하기 위해, 당신이 올바른지, 하나의 접근 방식은 실행 계획에서 작업의 순서를 제어의 일부 소량을 얻으려고 시도하는 것입니다. 문 힌트가 당신을 위해 작동하는 경우에, 당신은 그와 함께 갈 수 있습니다. (개인적으로, 힌트는 저를위한 최후의 수단이다.)

    SQL Server가 ISNUMERIC 기능을 가지고 않습니다.

    ISNUMERIC 함수는 ISNUMERIC 테스트 "전달"할 있지만이 수치 데이터로 변환 될 때 예외를 발생되는 일부 값이 있다는 점에서 약간 불충분하다.

    개인적으로, 나는이 방법으로가는 경향이있다 :

    select convert(float,case when isnumeric( t.foo )=1 then t.foo else null end)
    

    오히려 문 수준 힌트보다.

    또는, 나는 값 밖으로 "필터"변환 할 수 없습니다 말아야 할 다른 조건을 지정합니다.

    select convert(float,case when t.fi in ('fo','fum') then t.foo else null end)
    
  3. from https://stackoverflow.com/questions/7192524/unable-to-cast-value-as-float by cc-by-sa and MIT license